我只是想从视图中获取两个参数到我的控制器。我使用的是Rails 4.2.x,而强大的参数正在扼杀我。
一个参数:查询正确解析。但是第二个参数:location,会在问题标题中引发错误。我用谷歌搜索了这个问题,但每个人的情景似乎都不同,他们的解决方案(相对)也是独一无二的。
有问题的视图是index.html.erb
,其中只包含一个简单的搜索表单。
<%= form_tag("/searches", action: "create", method: "post") do %>
<div>Job Title</div>
<%= text_field_tag(:query) %>
<div>Location</div>
<%= text_field_tag(:location) %>
<%= submit_tag("Go") %>
<% end %>
有问题的控制器是searches_controller.rb
。
class SearchesController < ApplicationController
def index
binding.pry
end
def show
binding.pry
end
def update
end
def create
@query = search_params["query"].to_s || nil
@location = search_params[:location].to_s || nil
binding.pry
end
def delete
end
private
def search_params
params.require(:query).permit(:location)
end
end
堆栈跟踪指向search_params
方法,并告诉我控制器中有以下参数
{
"utf8"=>"✓",
"authenticity_token"=>"DEcTwT/NnSY3S3n25zZGXD+KRZcsRkWj9bmN57AMNivFbMXwHF5Vf/psgzSMkZPBa+OWJgafXYGdW+o5KN3xxg==",
"query"=>"titleofcoolstuff",
"location"=>"milwauke",
"commit"=>"Go"
}
我错过了什么?
答案 0 :(得分:4)
强参数用于提供属性哈希,例如:
<%= form_for @user do |f| %>
## form
<% end %>
这可能会发送如下参数:
"user" => { "name"=> "Your Name", "age" => "23", "location" => "USA" }
在这种情况下,强参数将指示rails处理属性的users
哈希,特别是这些属性,如下所示:
params.require(:user).permit(:name, :age, :location)
在你的情况下,你传递的是单个参数(而不是属性的哈希值),所以如果你想抓住它们,你可以明确地抓住它们:
def create
@query = params[:query].to_s || nil
@location = params[:location].to_s || nil
#do something
end
此处不需要强参数将模型属性列入白名单。希望这会有所帮助。
答案 1 :(得分:1)
在你的情况下
"query"=>"titleofcoolstuff",
"location"=>"milwauke",
"commit"=>"Go"
由于您的数据未包含任何键(它们位于根目录下),因此您只需使用params[:query]
即可访问它们。
白名单/强参数
我们需要将params列入白名单,仅用于大规模分配。与@user.update(user_params)
类似,除非user_params
中的用户发送的参数被列入白名单,即使用.permit
方法允许; update
方法将抛出异常ActiveModel::ForbiddenAttributes
。
在你的情况下,由于你没有更新任何东西,你不需要为它创建强大的参数。
def create
@query = params["query"].to_s || nil
@location = params[:location].to_s || nil
binding.pry
end
如果你将来要做大规模的作业,你必须将你的参数列入白名单