Добавление комментариев к модели и строгие параметры в Rails 4 Выдает ошибку

Я начал играть с Rails 4 прошлой ночью. И я делаю простое приложение типа блога, чтобы ознакомиться с некоторыми изменениями. У меня есть сообщения, работающие с скаффолдингом по умолчанию.

Я решил работать над добавлением комментариев без создания лесов, и я получаю эту ошибку, когда пытаюсь сохранить комментарий к сообщению:

ActiveModel::ForbiddenAttributesError in CommentsController#create

Запрос параметров на странице ошибки:

{"utf8"=>"✓",
 "authenticity_token"=>"jkald9....",
 "comment"=>{"commenter"=>"Sam",
 "body"=>"I love this post!"},
 "commit"=>"Create Comment",
 "post_id"=>"1"}

Вот действие создания контроллера комментариев:

    class CommentsController < ApplicationController
        def create
            @post = post.find(params[:post_id])
            @comment = @post.comments.create(params[:comment])
            redirect_to post_path(@post)
        end

        private

        def comment_params
          params.require(:comment).permit(:commenter, :body, :post_id)
        end
    end

Вот самая простая миграция для моих комментариев.

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.string :commenter
      t.text :body
      t.references :post, index: true

      t.timestamps
    end
  end
end

Что я делаю неправильно со строго типизированными параметрами? Или, может быть, в Rails 4 изменилось что-то еще, что я упустил?


person Rapture    schedule 18.06.2013    source источник


Ответы (2)


Немного оплошность, но я решил, что отвечу на этот вопрос, если кто-то еще работает над переносом аналогичного кода Rails 3 в Rails 4.

Вам нужно передать comment_params в массовое назначение следующим образом:

@comment = @post.comments.create(comment_params)
person Rapture    schedule 18.06.2013

Я обошел это, отредактировав функцию создания comments_controller на

def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(params[:comment].permit(:commenter, :body))
redirect_to post_path(@post)
end

Обратите внимание

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

С уважением

person George    schedule 12.09.2013