我在提交我的参数时遇到了问题,
portrait
和portrait_tag
通过我的表单传递给兄弟姐妹,
我怎么能同时允许这两个?
输出
{"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"", "portrait"=>{"artist_image"= "", @original_filename="rubytraining.jpg", @content_type="image/jpeg"}, "portrait_tag"=>{"tag_ids"=>["", "1", "2", "3", "4"]}, "commit"=>"Save changes", "controller"=>"admin/portraits", "action"=>"update", "id"=>"72"}
我尝试了以下
private
def portrait_params
params.require(:portrait).permit(:id, :artist_image)
params.require(:portrait_tag).permit(:id, :tag => [])
end
这些工作分开进行,但加在一起时会互相覆盖
控制器
def update
@portrait = Portrait.where(artist_id: 33, id: params[:id]).take
if @portrait.update(portrait_params)
redirect_to :edit_admin_portrait, flash: {notice: "Successfully updated your information"}
else
flash[:system] = @portrait.errors.full_messages
p @portrait.errors.full_messages
render :edit
end
end
private
def portrait_params
params.require(:portrait).permit(:id, :artist_image)
params.require(:portrait_tag).permit(:id, :tag => [])
end
修改表单
%h1 Edit Portrait
= form_for [:admin, @portraits] do |f|
- if flash[:system].present?
- flash[:system].each do |e|
%div= e
- if flash[:notice].present?
%div= flash[:notice]
= f.file_field :artist_image
= collection_select :portrait_tag, :tag_ids, Tag.all, :id, :name, {:selected => @portraits.tag_ids}, { :multiple => true}
= f.submit "Save changes", class: "btn btn-primary"
答案 0 :(得分:2)
标签是肖像的关联(portrait_tags)。
最后,问题的核心。在这种情况下,您应该使用accepts_nested_attributes_for
。它允许您在:portrait
参数内发布标记的属性。
所以你强大的params方法看起来像这样:
def portrait_params
params.require(:portrait).permit(:id, :artist_image, portrait_tags_attributes: [:id, :tag])
end
当然,相应地修改您的表格。
答案 1 :(得分:0)
您只返回portrait_params的最后一行。
params.require(:portrait_tag).permit(:id, :tag => [])
我这样做:
使用params (portrait, portrait_tag)
创建两个私有方法,它们将返回Hash'es,然后您可以合并它们。目前还不清楚是否有一个返回你的方法portrait_params
portrait_tag params如果它们不在嵌套属性中。
如果它们可以使用,但您必须将其添加到模型中
method accepts_nested_attributes_for
然后你就可以这样做
def portrait_params
params.require(:portrait).permit(:id, :artist_image, portrait_tags_attributes: [:id, :tag]))
end
答案 2 :(得分:0)
您可以使用nested_attributes同时更新父级和子级。但是你必须做出一些改变,例如你需要改变params结构。
例如:
params.require(:portrait).permit(:attr1,:att2,..., portrait_attributes: [:attr1, :attr2])
参考:http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html