【问题标题】:undefined method `[]' for nil:NilClass with rails params用于 nil:NilClass 的未定义方法“[]”与 rails 参数
【发布时间】:2014-01-06 23:05:50
【问题描述】:

我有以下代码:

<% if params %>
    <% puts 'user params are' + params['user'].inspect.to_s %>
           <% if params['user']['type'] == 'Student' %>
              <div class="signup-popup-bg-failure sign-freelancer"><% puts 'opt1stud' %>
          <% else%>
              <div class="signup-popup-bg sign-freelancer"><% puts 'opt2stud'%>
          <% end %>
<% else %>
    <div class="signup-popup-bg sign-freelancer"><% puts 'opt3stud'%>
<% end %>

这会返回错误:

undefined method `[]' for nil:NilClass

和线

<% if params['user']['type'] == 'Student' %>

突出显示。

我正在尝试根据参数更改显示的 css 类。


如果

params['type']['student'] 

存在,我希望类是:

<div class="signup-popup-bg-failure sign-freelancer">


如果

params['type']['Employer'] 

存在,我希望类是:

<div class="signup-popup-bg-failure sign-freelancer">

如果没有参数,我希望类是

 <div class="signup-popup-bg sign-freelancer">

我不明白为什么会出现这个错误。该页面说没有参数,因此甚至不应该执行此代码。更奇怪的是,没有一个“puts”语句被执行。这也没有意义,因为 if/else 逻辑规定必须执行其中一个 puts 语句。有谁知道如何让这个代码工作?

【问题讨论】:

  • 显然你的params['user'] 是nil。包含user params are: 的行打印了什么?
  • 是的,它们是零。打印出来的是:“user params arenil”
  • 所以你不能做nil[],这就是你得到错误的原因。
  • 是的 [] 是一个方法调用,并且您正在调用对 nil 的引用。您应该将参数传递给控制器​​中合适的模型,并在视图中使用某些模型实体的实例。

标签: ruby-on-rails devise ruby-on-rails-4 params


【解决方案1】:

我在这种情况下使用的快速技巧是:

<% if params.try(:[], 'user').try(:[], 'type') == 'Student' %>

而不是

<% if params['user']['type'] == 'Student' %>

try() 方法在此处完美记录: http://apidock.com/rails/Object/try [] 是发送到 params 哈希的方法。默认情况下,如果未找到密钥,哈希将返回 nil。这意味着您的哈希没有 'user' 键,而 params 返回 nil。

你可以在这里阅读params哈希:http://guides.rubyonrails.org/action_controller_overview.html#hash-and-array-parameters

puts 在 Rails 中无法正常运行。您应该使用logger 对象: http://guides.rubyonrails.org/debugging_rails_applications.html#sending-messages

类似:

logger.info params.inspect

【讨论】:

  • 那个hack是用空格写的吗? ;)
  • 对不起。只是按了几次tab,然后回车完成了:)我真的需要睡觉......
  • 您希望try 将数组文字作为其参数做什么?而params 应该是(一种方法退休) HashWithIndifferentAccess 所以符号与字符串无关紧要。
  • 看不到任何“数组文字”。它只是一个带有特定参数的[] 方法。
  • try([:user]) 使用数组字面量调用 try,params.try(:[], :user) 是 params[:user] 的试用版。
【解决方案2】:

我认为您将始终拥有某种类型的参数,至少是动作和控制器。

因此,您的代码将始终运行(即您的 if params 条件始终为真)。

在您的代码中,您可以输入 params.inspect 以查看 params 哈希包含的确切内容。

也许这样的东西对你有用:

<% if params.has_key?(:user) %>
  <% if params['user']['type'] == 'Student' %>
    ... etc ...
  <% else if params['user']['type'] == 'Employer' %>
    ... etc ...
  <% else %>
    ... default ...
  <% end %>
<% end %>

虽然这段代码可能可以使用演示器或装饰器(如 draper gem 或类似 Railscast 上的东西)进行清理:

http://railscasts.com/episodes/287-presenters-from-scratch.

或者甚至一个辅助方法会比视图层中的这种逻辑更可取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多