NoMethodError /验证无效

时间:2016-02-11 20:28:10

标签: ruby-on-rails

我有一个表单,我使用if语句从表格是新的@ current_user.name(adauth)中提取用户名,如果正在编辑表单,则输入@ complaint.user.name。

验证工作正常但现在,如果我尝试提交一个空表单或相关字段值为nil的表单,那么我会收到错误

Done
投诉的

_form.html.erb(我有条件代码)

NoMethodError in Complaints#create
Showing C:/Users/cmendla/RubymineProjects/internal_complaints/app/views/complaints/_form.html.erb where line #27 raised:

undefined method `name' for nil:NilClass
Trace of template inclusion: app/views/complaints/new.html.erb

Rails.root: C:/Users/cmendla/RubymineProjects/internal_complaints

Application Trace | Framework Trace | Full Trace
app/views/complaints/_form.html.erb:27:in `block in _app_views_complaints__form_html_erb__838826376_68516916'
app/views/complaints/_form.html.erb:1:in `_app_views_complaints__form_html_erb__838826376_68516916'
app/views/complaints/new.html.erb:3:in `_app_views_complaints_new_html_erb__529765002_56812308'
app/controllers/complaints_controller.rb:150:in `block (2 levels) in create'
app/controllers/complaints_controller.rb:135:in `create'

第27行是 <strong>Originator:</strong><br> <!-- Below will show the user name. If it is not a new complaint, we pull the user name from the complaint table Otherwise, we get the name of the currently logged in user. --> <% if action_name != "new" then %> <%= @user.name %> <% else %> <%= @current_user.name %> <%= f.hidden_field(:user_id, :value => @current_user.id) %> <% end %> </td> 我认为发生的事情是验证失败后的重新加载不再是“新”的操作。我怎样才能解决这个问题?

<%=  @user.name %>

我认为发生的事情是,在验证失败后重新加载表单时,它不再是'new'的控制器操作。

2 个答案:

答案 0 :(得分:1)

undefined method `name' for nil:NilClass

此错误仅表示您的@usernil,这就是<%= @user.name %>失败的原因。确保您的@user具有值,而不是nil。然后,它会工作。

您也可以尝试使用try,如下所示:<%= @user.try(:name) %>。这样,当@user为零时,您的程序不会崩溃。但是,最好的方法是找出为什么@user为零并修复它。

答案 1 :(得分:0)

我发现当验证失败时,操作从NEW转为CREATE。下面的代码将显示NEW和CREATE操作的@ current_user.name以及编辑操作表中的@ user.name。

  <% if action_name != "new" && action_name != "create" then %>
      <%=  @user.name %>
  <% else %>
      <%= @current_user.name %>
          <%= f.hidden_field(:user_id, :value => @current_user.id) %>
  <% end %>