반응형
Nuxt.js에서 Rails로 전송된 데이터를 저장하고 싶다.
내가 이루고 싶은 것
Nuxt.js에서 Rails로 보낸 데이터를 저장하고 싶습니다.Rails가 accepts_nested_attributes_for를 사용하여 관련지어 데이터를 저장하려고 합니다.
코드
레일
모델/포스트.인쇄
class Post < ApplicationRecord
has_many :post_items, dependent: :destroy
accepts_nested_attributes_for :post_items, allow_destroy: true
validates :title, presence: true
validates :author, presence: true
validates :image, presence: true
end
model/post_item.model
class PostItem < ApplicationRecord
belong_to :post
end
앱/컨트롤러/controller_controller
class Api::V1::PostsController < ApplicationController
def index
posts = Post.all
render json: posts
end
def create
post = Post.new(post_params)
if post.save
render json: 'Succeeded', status: 200
else
render json: 'Error', status: 500
end
end
private
def post_params
params.require(:post).permit(:title, :author, :image, post_items_attributes: [:content, :status])
end
end
Nuxt.js
저장/할 일js
export const state = () => ({
list: [],
hidden: false
})
export const mutations = {
add (state, text) {
state.list.push({
text,
status: false
})
},
remove (state, todo) {
state.list.splice(state.list.indexOf(todo), 1)
},
edit (state, { todo, text }) {
state.list.splice(state.list.indexOf(todo), 1, { text })
},
toggle (state, todo) {
todo.status = !todo.status
},
cancel (state, todo) {
todo.status = false
},
switching (state) {
state.hidden = !state.hidden
}
}
// Rails send
export const actions = {
postTextAdd ({ commit }, content) {
const postAxios = this.$axios.$post
const url = '/api/v1/'
postAxios(url + 'posts', {
post: {
post_items_attributes: {
content: 'test',
status: false
}
}
})
.then((response) => {
commit('add', response)
console.log(response)
})
}
}
템플릿
・・・
methods: {
addTodo () {
// postTextAddでRailsに送る
if (this.selectedTodo.status === false) {
this.$store.dispatch('todos/postTextAdd', this.itemText)
this.itemText = ''
console.log(this.todos)
} else {
this.$store.commit('todos/edit', { todo: this.selectedTodo, text: this.itemText })
this.itemText = ''
this.$store.commit('todos/toggle', this.selectedTodo)
}
},
에러
터미널
api_1 | Started POST "/api/v1/posts" for 192.168.96.1 at 2021-08-06 07:41:38 +0900
api_1 | Processing by Api::V1::PostsController#create as HTML
api_1 | Parameters: {"post"=>{"post_items_attributes"=>{"content"=>"test", "status"=>false}}}
api_1 | Completed 500 Internal Server Error in 27ms (ActiveRecord: 0.0ms | Allocations: 4188)
api_1 |
api_1 |
api_1 |
api_1 | TypeError (no implicit conversion of Symbol into Integer):
api_1 |
api_1 | app/controllers/api/v1/posts_controller.rb:8:in `create'
내가 직접 시도한 것
①api_1 | app/controllers/api/v1/posts_controller.rb:8:in `create'
def create
post = Post.new(post_params)
if post.save
render json: 'Succeeded', status: 200
else
render json: 'Error', status: 500
end
end
위의 내용을 확인했는데, create만 저장하기 때문에 오류와 관련된 것인지 알 수 없었습니다.
②TypeError (no implicit conversion of Symbol into Integer):
Nuxt가 보낸 데이터와 Rails가 받은 데이터가 다르다고 생각합니다만, Rails의 문서에서 찾아보니 기호 이외에는 찾을 수 없었습니다.
문제가 중첩된 매개 변수에 있습니다.중첩된 속성은 해시가 아닌 해시 배열로 나타납니다.이를 변경하면 다음과 같습니다.
post: {
post_items_attributes: {
content: 'test',
status: false
}
}
대상:
post: {
post_items_attributes: [{
content: 'test',
status: false
}]
}
그건 작동할 거야.다음 번에 Post 모델 검증이 진행되기 때문에 에러마다 다른 에러가 발생합니다.
언급URL : https://stackoverflow.com/questions/68674559/i-want-to-save-the-data-sent-from-nuxt-js-to-rails
반응형
'source' 카테고리의 다른 글
컴파일 가드가 다중 정의 포함을 방지하지 못하는 이유는 무엇입니까? (0) | 2022.08.19 |
---|---|
VueJ + Vuex + map Actions (0) | 2022.08.19 |
Vue: 템플릿은 키를 입력할 수 없지만 템플릿을 div로 바꿀 수 없음 - 래퍼 div 요소가 없는 v-for, 중첩된 v-for 루프가 필요합니다. (0) | 2022.08.18 |
외부에서 처리되는 요소를 Vue.js에 추가하시겠습니까? (0) | 2022.08.18 |
NUXT: 비동기 가져오기를 혼합으로 사용하여 덮어쓸 페이지 데이터에 액세스하는 방법 (0) | 2022.08.18 |