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