如何允许模型的所有属性

时间:2015-07-23 21:54:25

标签: ruby-on-rails strong-parameters

我正在将Rails 3.2应用程序迁移到strong_parameters,并且没有太多经验。

我有一个名为Item的模型,其中包含has_many属性。在我们的#update中,我希望能够执行以下操作:

# Model
class Item < ActiveRecord::Base
  include ActiveModel::ForbiddenAttributesProtection
  has_many :assets, :as => :assetable, :dependent => :destroy
...

#in items_controller.rb

def update
  @item=Item.find(params[:id])
  if @item.update_attributes(params[:item])

...
private

def item_params
  params.require(:item).permit(:assets_attributes).permit!
end

如何指定item_params以允许通过此更新语句创建资产?

编辑1

所以,如果我通过以下方式提取属性列表:

a=Asset.first
a.attributes

我明白了:

{"id"=>4424,
 "name"=>nil,
 "created_at"=>Fri, 24 Jan 2014 15:49:17 PST -08:00,
 "updated_at"=>Fri, 24 Jan 2014 15:49:17 PST -08:00,
 "asset_file_name"=>"br-3.jpg",
 "asset_content_type"=>"image/jpeg",
 "asset_file_size"=>198085,
 "asset_updated_at"=>Fri, 24 Jan 2014 15:49:16 PST -08:00,
 "menu_item_id"=>nil,
 "assetable_id"=>1,
 "assetable_type"=>"LocationProfileAlbum",
 "global_id"=>9394,
 "description"=>nil,
 "associated_global_id"=>9393,
 "user_id"=>nil,
 "position"=>0.0,
 "hash_val"=>nil,
 "is_instore"=>false,
 "location_id"=>nil,
 "filepicker_url"=>nil}

如果我把它放进去:

  def item_params
    params.require(:item).permit(
        :assets_attributes[
            :id, :name, :created_at, :updated_at , :asset_file_name, :asset_content_type, :asset_file_size, :asset_updated_at, :menu_item_id, :assetable_id, :assetable_type, :global_id, :description, :associated_global_id, :user_id, :position, :hash_val, :is_instore, :location_id, :filepicker_url
        ]
    )

然后添加一个文件,我收到错误:

ArgumentError (wrong number of arguments (20 for 1..2)):
  app/controllers/items_controller.rb:218:in `[]'
  app/controllers/items_controller.rb:218:in `item_params'

1 个答案:

答案 0 :(得分:1)

首先,您需要指定允许嵌套资产的哪些属性,例如:

def item_params
  params.require(:item).permit(assets_attributes: [:col1, :col2, :col3])
end

然后,确保在更新@item时使用此私有方法:

@item.update_attributes item_params

ETA(基于您的edit1):paperclip POST实际文件,而不是其属性,因此您将:

params.require(:item).permit(assets_attributes: [:asset])

为了将来参考,您可以找到传递给日志中的操作的参数。它看起来像是:

  Parameters: {"utf8"=>"✓", "item"=>{"assets_attributes"=>[{"asset"=>#<ActionDispatch::Http::UploadedFile…>}]}

日志还将包括通知强参数已排除任何参数。这对于确定需要允许哪些参数非常有用。

我还强烈建议不要将所有参数添加到允许列表中。强参数受到严重安全问题的驱使,即攻击者能够编辑他们不应该访问的字段。基本上,请记住,有权访问该网页的任何人都可以为允许列表中的任何参数发布任何值。