我正在玩Rails 4.x beta并尝试使用carrierwave获取嵌套属性.不确定我正在做的是正确的方向.搜索后,最后查看导轨源和强参数,我发现了下面的注释.
Run Code Online (Sandbox Code Playgroud)# Note that if you use +permit+ in a key that points to a hash, # it won't allow all the hash. You also need to specify which # attributes inside the hash should be whitelisted.
所以它说你必须在has中指定每一个单独的属性,我尝试了以下内容:
帕拉姆的例子:
{"utf8"=>"?",
"authenticity_token"=>"Tm54+v9DYdBtWJ7qPERWzdEBkWnDQfuAQrfT9UE8VD=",
"screenshot"=>{
"title"=>"afs",
"assets_attributes"=>{
"0"=>{
"filename"=>#<ActionDispatch::Http::UploadedFile:0x00000004edbe40
@tempfile=#<File:/tmp/RackMultipart20130123-18328-navggd>,
@original_filename="EK000005.JPG",
@content_type="image/jpeg",
@headers="Content-Disposition: form-data; name=\"screenshot[assets_attributes][0][filename]\"; filename=\"EK000005.JPG\"\r\nContent-Type: image/jpeg\r\n">
}
}
},
"commit"=>"Create Screenshot"}
Run Code Online (Sandbox Code Playgroud)
调节器
def screenshot_params
params.require(:screenshot).permit(:title,
:assets_attributes => [:filename => [:@tempfile,:@original_filename,:@content_type,:@headers]
Run Code Online (Sandbox Code Playgroud)
以上不是"工作"(它不触发载波)但是当我使用我发现的标准嵌套示例时,我不再收到错误(未经许可的参数:文件名):
def screenshot_params
params.require(:screenshot).permit(:title, assets_attributes: :filename)
Run Code Online (Sandbox Code Playgroud)
如果有人能提供帮助就会很棒.我无法找到嵌套了一个指向哈希的键的示例.
在Rails 4中,这是关于如何做到这一点的问题.我想知道的是,虽然这有效,但为什么日志还在抱怨?
在Rails 5.1.3中,我有一个JSON列(letterhead)作为我的模型属性之一(并且里面的json是一个具有各种属性的哈希,我不关心白名单).我只是想让列本身允许/列入白名单.
关于Rails的注意事项5.1.4
在5.1.4中有一种Rails方法可以做到这一点,请参阅此提交.有一个相当长的讨论在这里关于这个github上.在Rails 5.1.4中,它只是这样:
def account_params
params.require(:account).permit(:id, :name, :plan_id, letterhead: {})
end
Run Code Online (Sandbox Code Playgroud)
:letterhead允许该参数,日志中不显示错误,模型保存.但显然它允许在该参数内任意输入,因此请小心使用.
如果您确实想限制在这样的参数中允许哪些哈希键,那么您也可以将这些哈希值列入白名单,例如:
def account_params
params.require(:account).permit(:id, :name, :plan_id, letterhead: [:address, :logo, :contact_info])
end
Run Code Online (Sandbox Code Playgroud)
这现在可以防止任何其他任意键,:letterhead因为我明确地只允许这些3 -:address, :logo, :contact_info
Rails 5.1.3(及更早版本)
我可以使用以下任一方式允许此列(有关其他可能选项,请参阅链接的讨论):
选项1
def account_params
params.require(:account).permit(:id, :name, :plan_id, :letterhead).tap do |whitelisted|
whitelisted[:letterhead] = params[:account].fetch(:letterhead, ActionController::Parameters.new).permit!
end
end
Run Code Online (Sandbox Code Playgroud)
选项2
def account_params
params.require(:account).permit(:id, :name, :plan_id, :letterhead).tap do |whitelisted|
whitelisted[:letterhead] = params[:account][:letterhead].permit!
end
end …Run Code Online (Sandbox Code Playgroud) 我在编辑嵌套属性时遇到问题。我收到此错误:
no implicit conversion of Symbol into Integer
Run Code Online (Sandbox Code Playgroud)
事件.rb:
Class Event < ActiveRecord::Base
has_many :event_joins, :dependent => :destroy
accepts_nested_attributes_for :event_joins
end
Run Code Online (Sandbox Code Playgroud)
events_controller.rb :
private
def event_params
params.require(:event).permit(event_joins_attributes: [:duration])
end
Run Code Online (Sandbox Code Playgroud)
_form.html.erb :
=f.fields_for :event_joins_attributes do |a|
=number_field_tag 'event[event_joins_attributes][duration]'
end
Run Code Online (Sandbox Code Playgroud)
如果我改变了我params之前的许可
params[:event][:event_joins_attributes][:duration] = params[:event][:event_joins_attributes][:duration].to_i
Run Code Online (Sandbox Code Playgroud)
我有以下错误:
no implicit conversion of String into Integer
Run Code Online (Sandbox Code Playgroud)
我已经阅读了很多关于大规模分配的嵌套属性的帖子,但没有任何效果。这是我读过的部分帖子。
rails-4-strong-parameters-nested-objects
当然,我不想做
params.require(:event).permit!
Run Code Online (Sandbox Code Playgroud) ruby-on-rails nested-attributes strong-parameters ruby-on-rails-4