Параметр формы Rails не сохраняется

70
7

Я очень новичок в Ruby on Rails, и я борюсь с моим контроллером. Я сделал вложенный ресурс, где мои комментарии размещены в сообщениях.

class Post < ActiveRecord::Base
validates :name, :presence => true
validates :title, :presence => true, :length => { :minimum => 5 }
has_many :comments
end

class Comment < ActiveRecord::Base
validates :commenter, :presence => true
validates :body, :presence => true
belongs_to :post
end

Упрощенная версия контроллера

class CommentsController < ApplicationController
before_action :set_comment, only: [:show, :edit, :update, :destroy]

# omited new, index, show...

# POST /comments
# POST /comments.json
def create
post = Post.find(params[:post_id])
@comment = post.comments.create(params[:comment].permit(:name, :title, :context))

respond_to do |format|
if @comment.save
format.html { redirect_to([@comment.post, @comment], notice: 'Comment was successfully created.') }
format.json { render action: 'show', status: :created, location: @comment }
else
format.html { render action: 'new' }
format.json { render json: @comment.errors, status: :unprocessable_entity }
end
end
end

# PATCH/PUT /comments/1
# PATCH/PUT /comments/1.json
def update
post = Post.find(params[:post_id])
@comment = post.comments.find(params[:comment])
respond_to do |format|
if @comment.update(comment_params)
format.html { redirect_to @comment, notice: 'Comment was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @comment.errors, status: :unprocessable_entity }
end
end
end

private
# Use callbacks to share common setup or constraints between actions.
def set_comment
@comment = Comment.find(params[:id])
end

# Never trust parameters from the scary internet, only allow the white list through.
def comment_params
params.require(:comment).permit(:commenter, :body, :post)
end
end

Когда я заполняю форму, я получаю это исключение:

2 ошибки не позволяют сохранить этот комментарий: комментатор не может быть пустым. Тело не может быть пустым.

Я пробовал это руководство, но я думаю, что он не на 100% совместим с Rails 4.

спросил(а) 2014-01-12T18:49:00+04:00 6 лет, 8 месяцев назад
1
Решение
89

Вы читаете атрибуты params для Post (:name, :title, :context), но вам нужно прочитать атрибуты " Comments (:commenter, :body)

замените это:

@comment = post.comments.create(params[:comment].permit(:name, :title, :context))

с

@comment = post.comments.create(params[:comment].permit(:commenter, :body))

или, что гораздо лучше, с:

@comment = post.comments.create(comment_params)

ответил(а) 2014-01-12T20:18:00+04:00 6 лет, 8 месяцев назад
41

По-видимому, вы явно permitting разные атрибуты в вашем действии create.

Вы должны обновить свое действие create чтобы использовать comment_params как вы это делали в действии update. Причина в том, что ваш Comment определенно ожидает Commenter и Body а не :name, :title, :context который вы разрешили в своем действии на create.

controller обновления create действие как:

  # POST /comments
# POST /comments.json
def create
...
@comment = post.comments.create(comment_params)
...
end

ответил(а) 2014-01-12T19:01:00+04:00 6 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема