2016-02-11 5 views
0

У меня есть форма, где я использую оператор if, чтобы вытащить имя пользователя из @ current_user.name (adauth), если форма является новой, и @ complaints.user.name, если форма редактируется.NoMethodError/validations not working

В валидации работала, но теперь, если я пытаюсь представить пустую форму или форму, где соответствующее значение поля равно нуль, то я получаю ошибку

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' 

_form.html.erb для жалоб (где я есть условный код)

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

линия 27 <%= @user.name %> Я думаю, что то, что происходит не в том, что перезагрузка после неудачной проверки уже не действие «нового». Как я могу это исправить?

validates_presence_of :status 
    validates_presence_of :sales_order 
    validates_presence_of :product_name 
    validates_presence_of :coater_roll_number 
    validates_presence_of :coater_work_order 
    validates_presence_of :slitter_disposition 
    validates_presence_of :length 
    validates_presence_of :measure 
    validates_presence_of :disposition 
    validates_presence_of :reason_for_complaint 
    validates_presence_of :customer 

Я думаю, что это происходит не в том, что, когда форма перезагружается после проваливать проверки, он больше не является действие контроллера «нового».

+1

Где вы установите '@ user'? Убедитесь, что он заполнен значением. –

ответ

1
undefined method `name' for nil:NilClass 

Эта ошибка просто означает, что ваш @user является nil, и именно поэтому она терпит неудачу на <%= @user.name %>. Убедитесь, что ваше значение @user имеет значение и не равно nil. Тогда это сработает.

Вы также можете попробовать использовать try следующим образом: <%= @user.try(:name) %>. Таким образом, ваша программа не сработает, когда @user - это нуль. Но лучший способ - выяснить, почему @user - это нуль и исправить это.

0

Я обнаружил, что при неудачной проверке действие переходит из NEW в CREATE. В приведенном ниже коде будет показано имя @ current_user.name для действий NEW и CREATE и @ 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 %>