未定义的方法`[]'为nil:NilClass with rails params

时间:2014-01-06 23:05:51

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

我有以下代码:

<% 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。


如果

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">

我不明白为什么会出现这种错误。页面说没有参数,所以甚至不应该执行此代码。甚至更奇怪的是,没有任何一个&#39;放置&#39;语句正在执行。这没有意义,因为if / else逻辑规定必须执行其中一个puts语句。有谁知道如何使这个代码工作?

2 个答案:

答案 0 :(得分:3)

我正在使用的快速黑客是:

<% 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

答案 1 :(得分:1)

我认为你总会有某种类型的参数,至少是动作和控制器。

因此,您的代码将始终运行(即您的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

甚至辅助方法也比视图层中的这种逻辑更好。