我有一个表单,我使用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'的控制器操作。
答案 0 :(得分:1)
undefined method `name' for nil:NilClass
此错误仅表示您的@user
为nil
,这就是<%= @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 %>