嗨我遇到了我的代码问题,我不知道在哪里使用强参数。在这种情况下,我有一个文档对象,其中混合了预设值和来自我的表单的值。
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创建新文档,其他值不是来自我的表单。
感谢。
答案 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"