Как избежать неопределенного метода `empty? ' для нуля: NilClass? - PullRequest
0 голосов
/ 02 марта 2020

Я сталкиваюсь с ошибкой. undefined method empty? for nil:NilClass? Кажется, это происходит часть времени. Я выставил тот же код контроллера в шоу и новый. Может ли кто-нибудь указать мне правильное направление относительно того, почему я получаю ошибку и как этого можно избежать? Я создаю клиентов и прикрепляю к ним список. Иногда список существует до того, как покупатель иногда нет. Спасибо

Настройка списков есть много клиентов. Итак, я иду в customer_path и нажимаю new_customer_path, и я получаю сообщение об ошибке. Если я делаю список первым, иногда это работает. Иногда, если я refre sh вещи работают. Если я перезагружаю сервер, то он перестает работать с первой попытки. Итак, я знаю, что что-то работает, но я не уверен, почему я получаю противоречивые результаты? Мысли

customer_controller.rb - index - Пытаетесь, возможно, предварительно установить его?

  @customer = Customer.new
   @customers = Customer.where("user_id = ?", uid).order(updated_at: :desc)
    # @lists = List.where(user_id: current_user.id).order("created_at asc").pluck(:name, :id)
    @lists = List.where(user_id: current_user.id).order("created_at asc")

customer_controller.rb - новый

  def new
    @customer = Customer.new
    puts " "
    puts "============="
    # @lists = List.where(user_id: current_user.id).order("created_at asc").pluck(:name, :id) rescue nil
    @lists = List.where(user_id: current_user.id).order("created_at asc")
    puts @lists.count
    puts " "
    puts "============="
  end

Customers_form.erb который is _form.erb

<%= form_for(customer) do |f| %>
<% if customer.errors.any? %>
  <div id="error_explanation">
    <h2><%= pluralize(customer.errors.count, "error") %>
      prohibited this customer from being saved:</h2>
    <ul>
      <% ccustomer.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  </div>
<% end %>
<div class="form-box">
  <div class="field">
    <%= f.label "First Name" %>
    <%= f.text_field :firstname, :class => 'form-control' %>
  </div>
  <div class="field center">
    <label>List</label>
    <%#= f.select :list_id, options_for_select(@lists.map{ |list| [list.name, list.id] }), prompt: 'Not Assigned', class: 'form-control input-lg' %>
      <%= f.select :list_id, @lists, { :include_blank => 'Not Assigned'}, class: 'form-control input-lg' %>
    </div>
    <%= f.hidden_field :user_id, :value => current_user.id %>
    <br>
    <div class="actions">
      <%= f.submit "Save", :class => "btn btn-lg btn-long btn-warning" %>
    </div>
  </div>

Мой вывод журнала:

Started GET "/customers/new" for 127.0.0.1 at 2020-03-01 20:37:41 -0800
Processing by CustomersController#new as HTML
  User Load (1.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 18], ["LIMIT", 1]]
  Rendering customers/new.html.erb within layouts/application
  Rendered customers/_form.html.erb (29.6ms)
  Rendered customers/new.html.erb within layouts/application (32.3ms)
Completed 500 Internal Server Error in 74ms (ActiveRecord: 11.3ms)



ActionView::Template::Error (undefined method `empty?' for nil:NilClass):
    39: 
    40:   <div class="field center">
    41:     <label>List</label>
    42:     <%= f.select :list_id, @lists, { :include_blank => 'Not Assigned'}, class: 'form-control input-lg' %>
    43:   </div>
    44: <% end %>
    45: 

app/views/customers/_form.html.erb:42:in `block in _app_views_customers__form_html_erb__810149171042607559_70218705879220'
app/views/customers/_form.html.erb:1:in `_app_views_customers__form_html_erb__810149171042607559_70218705879220'
app/views/customers/new.html.erb:8:in `_app_views_customers_new_html_erb__187385255323143294_70218705803580'
  Rendering /Users/MyName/.rvm/gems/ruby-2.5.1/gems/actionpack-5.0.7/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout
  Rendering /Users/MyName/.rvm/gems/ruby-2.5.1/gems/actionpack-5.0.7/lib/action_dispatch/middleware/templates/rescues/_source.html.erb
  Rendered /Users/MyName/.rvm/gems/ruby-2.5.1/gems/actionpack-5.0.7/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (4.0ms)
  Rendering /Users/MyName/.rvm/gems/ruby-2.5.1/gems/actionpack-5.0.7/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb
  Rendered /Users/MyName/.rvm/gems/ruby-2.5.1/gems/actionpack-5.0.7/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (1.6ms)
  Rendering /Users/MyName/.rvm/gems/ruby-2.5.1/gems/actionpack-5.0.7/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb
  Rendered /Users/MyName/.rvm/gems/ruby-2.5.1/gems/actionpack-5.0.7/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (0.7ms)
  Rendered /Users/MyName/.rvm/gems/ruby-2.5.1/gems/actionpack-5.0.7/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout (69.2ms)

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Лучше всего начать с использования спасения, ниже приведен лишь небольшой фрагмент кода, как это сделать -

    def index
        begin
          @lists = List.where(user_id: current_user.id)
        rescue
          flash[:notice] = "ERROR"
          redirect_to(:action => 'index')
          return
        end
     flash[:notice] = "OK"
     redirect_to(:action => 'index')
    end

Это также работает -

  @lists = List.where(user_id: current_user.id).order("created_at asc").pluck(:name, :id) rescue nil

Подробнее об этом здесь - https://guides.rubyonrails.org/debugging_rails_applications.html#catching - исключения

1 голос
/ 02 марта 2020

Попробуйте, удалите pluck отсюда

@lists = List.where(user_id: current_user.id).order("created_at asc")

вместо карты здесь

<%= f.select :list_id, options_for_select(@lists.map{ |list| [list.name, list.id] }), prompt: 'Not Assigned', class: 'form-control input-lg' %>

Попробуйте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...