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



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

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将这两个值列入白名单?如果是这样的话,我如何使用强参数来创建具有其他值的新文档,这些值不是来自我的表单

谢谢。

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以及其他params:

{ document: { name: '<Name>', parent_id: '<Id>' }, other_params: '...' }
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

你的代码确实可以改进很多。

首先,Rails4+约定是具有模型的"顶级"参数值(在您的案例中为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"

相关内容

  • 没有找到相关文章

最新更新