我有以下代码:
<% 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语句。有谁知道如何使这个代码工作?
答案 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
甚至辅助方法也比视图层中的这种逻辑更好。