ActiveModel::ForbiddenAttributesError в контроллере комментариев

У меня есть контроллер комментариев и контроллер продуктов. Сбой при создании действия контроллера комментариев с ошибкой Forbidden Attributes.

Я удалил все атрибуты attr_accessible из моделей и переместил их в контроллер. Все равно что-то не так. Я не могу понять, что. Пожалуйста, кто-нибудь может сказать мне, что мне не хватает.

 @comment = @commentable.comments.new(params[:comment]) <--- Fail here

Live Shell o/p от Better Errors:

   >> params[:comment]
   => {"content"=>"thanks"}

   >> @commentable
   => #<Product id: 1, title: "Coffee Mug", description: "<p> This coffee mug blah blah", image_url: "http://coffee.com/en/8/82/The_P...", price: #<BigDecimal:7ff8769a9e00,'0.999E1',18(45)>, tags: nil, created_at: "2014-02-24 14:49:34", updated_at: "2014-02-24 14:49:34">

  >> @commentable.comments
  => #<ActiveRecord::Associations::CollectionProxy []>


  >> @commentable.comments.new(params[:comment])
  !! #<ActiveModel::ForbiddenAttributesError: ActiveModel::ForbiddenAttributesError>
  >>

Контроллер комментариев:

class CommentsController < ApplicationController

 def new
  @comment = @commentable.comments.new
end

def create
 @comment = @commentable.comments.new(params[:comment]) <-- fail here
 if @comment.save
      redirect_to product_path(params[:product_id])
 else
      render :new
 end

конец

   def comments_params
       params.require(:comments).permit(:commentable, :product_id, :content)
   end

Контроллер продукта:

  class ProductsController < ApplicationController

   def show
    @product = Product.find(params[:id])
    @commentable =  @product
    @comments ||= Comment.where(:commentable_id => params[:id])
    @comment = Comment.new
   end

   def product_params
       params.require(:product).permit(:title, :description, :image_url, :price, :tags, comments_attributes: [:product_id, :content])
   end

Модели : product.rb

   class Product < ActiveRecord::Base

       has_many :comments, as: :commentable 
       accepts_nested_attributes_for :comments
   end

комментарий.rb

   class Comment < ActiveRecord::Base

       belongs_to :commentable, polymorphic: true

   end

person user2511030    schedule 24.02.2014    source источник


Ответы (1)


Я предполагаю, что вы используете Rails4, так как вы реализовали метод comments_params. В Rails 4 сильные параметры используются для переноса защиты массового назначения из модели в контроллер. Вы реализовали метод comments_params, но не используете его.

Заменять

@comment = @commentable.comments.new(params[:comment]) 

с

@comment = @commentable.comments.new(comments_params) 

Также обновите comments_params следующим образом

  def comments_params
       params.require(:comment).permit(:commentable, :product_id, :content)
   end

ПРИМЕЧАНИЕ: требуется :comment в единственном числе, а не :comments во множественном числе.

person Kirti Thorat    schedule 24.02.2014
comment
Да, это Rails 4.0. Я попробовал ваше предложение. Кажется, это не работает. Если я это сделаю, он говорит: параметр не найден: комментарии - person user2511030; 24.02.2014
comment
Кирти! Это сработало. Подскажите, пожалуйста, что я делал не так? - person user2511030; 24.02.2014
comment
если вы проверите содержимое хэша параметров в оболочке, вы увидите, что он имеет ключ с именем comment (единственное число), и вы пытались найти ключ с именем comments (множественное число), которого не было в хэше параметров. Итак, вы получили ошибку param not found: comments - person Kirti Thorat; 24.02.2014
comment
Полагаю, что так. это Duh меня. Спасибо, в любом случае! - person user2511030; 24.02.2014