Rails - 允许params&的问题要求

时间:2016-12-07 15:35:24

标签: ruby-on-rails

我在提交我的参数时遇到了问题,

portraitportrait_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"

3 个答案:

答案 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