在控制器中分配模型属性时使用强参数

时间:2015-12-23 01:33:19

标签: ruby-on-rails ruby-on-rails-4 model-view-controller strong-parameters

嗨我遇到了我的代码问题,我不知道在哪里使用强参数。在这种情况下,我有一个文档对象,其中混合了预设值和来自我的表单的值。

class DocumentsController < ApplicationController
 def add_document
  document_name = params[:document_name]
  document_parent_id = params[:doc_parent_id]

  @document = Document.new(name: document_name, parent_id: document_parent_id, document_owner_id: current_user_id, created_by: current_user.name)
  @document.save
   #do flash stuff here
 end

因此表单只是通过params哈希提交文档名称和文档父ID。这两个值是否应该使用强参数列入白名单?如果是这样,我如何使用强params创建新文档,其他值不是来自我的表单。

感谢。

2 个答案:

答案 0 :(得分:0)

1 /是它应该列入白名单。

def add_document
  # stuff
  @document = Document.new(document_params.merge(
    document_owner_id: current_user_id, 
    created_by: current_user.name
  ))
  # stuff
end

def document_params
  params.require(:document).permit(:name, :parent_id)
end

2 /要从表单提交,您只需要在params中提交嵌套属性document以及其他参数:

{ document: { name: '<Name>', parent_id: '<Id>' }, other_params: '...' }

答案 1 :(得分:0)

class DocumentsController < ApplicationController
  def add_document
    @document = Document.new document_params.merge(document_owner_id: current_user_id, created_by: current_user.name)
    @document.save
  end

  private

  def document_params
    params.permit(:document_name, :doc_parent_id)
  end 

end

你的代码真的可以改善很多。

首先,Rails 4+惯例是有一个&#34;顶级&#34;模型的参数值(在您的情况下为document):

params: {
   document: {
      document_name: "x",
      doc_parent_id: "y"
   }
}

这将允许您正确调用强params方法:

def document_params
   params.require(:document).permit(:document_name, :doc_parent_id)
end

实现此目的的方法是使用form_for(应与RESTful控制器一起使用):

#app/views/documents/new.html.erb
<%= form_for @document do |f| %>
  <%= f.text_field :document_name %>
  <%= f.submit %>
<% end %>

#app/controllers/documents_controller.rb
class DocumentsController < ApplicationController
   def new
      @document = Document.new
   end

   def create
      @document = Document.new document_params
      @document.save
   end
end

-

最后,您还需要确保模型属性名称正常运行。

您目前正在使用document_name作为属性名称。如果是我的申请,我会将其称为name,以便您日后致电@document.name

您的其他属性也一样:

document_name -> "name"
doc_parent_id -> "parent_id"
document_owner_id -> "owner_id"