未定义的方法`permit' for" titleofcoolstuff":String

时间:2015-10-27 00:03:53

标签: ruby-on-rails ruby ruby-on-rails-4 strong-parameters

我只是想从视图中获取两个参数到我的控制器。我使用的是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" }

我错过了什么?

2 个答案:

答案 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
  

如果你将来要做大规模的作业,你必须将你的参数列入白名单

有关详细信息,请参阅https://cbabhusal.wordpress.com/2015/10/02/rails-strong-params-whilisting-params-implementation-details/