Ruby on Rails - неопределенный метод `each 'для ошибки nil: NilClass - PullRequest
0 голосов
/ 17 октября 2018

Я рассмотрел API для своей конкретной ошибки, и предоставленные ответы не могут решить мою проблему.

Я просто экспериментирую с кодом "найти ближайшее местоположение", полученным в Интернете, и мойПроблема в том, что когда я внедряю этот код в проект, я получаю «неопределенный метод` each »для ошибки nil: NilClass».

Я понимаю, что эта ошибка будет вызвана тем, что при вызове @something она не определена.Итак, это код и файлы, с которыми я работаю:

location.rb

class Nearby_Location < ActiveRecord::Base
  geocoded_by :full_address
  after_validation :geocode, :if => :address_changed?

  def full_address
   [address, city, postcode].compact.join(',')
  end
end

location_controller.rb

class Locations < ApplicationController
  def index
    @locations = Locations.all
    if params[:search].present?
      @locations = Locations.near(params[:search], 10, :order => :distance)
    else
      @locations = Locations.all.order("created_at DESC")
    end
  end

  def new
    @locations = Locations.new
  end

  def create
    @locations = Locations.new(location_params)
    if @locations.save
      flash[:success] = 'Place added!'
      redirect_to root_path
    else
      render 'new'
    end
  end

  def location_params
    params.require(:location).permit(:company_name, :address, :city,
                                    :postcode, :latitude, :longitude)
  end

  def show
    render :layout => nil
    @locations = Locations.find(params[:id])
  end

end

page.html.erb

<div class="container">
  <div class="starter-template">
    <h3>Find places near your location</h3>
    <p class="lead">Enter your address or zip code</p>
    <p><%= form_tag locations_path, :method => :get do %>
      <%= text_field_tag :search, params[:search], placeholder: "e.g Statue of Liberty, New York" %>
      <%= submit_tag "Search Near", :name => nil %>
      <% end %>
    </p>
  </div>

  <% @locations.each do |locations| %>
 <%= link_to locations do %>
  <%= locations.name %>
 <% end %>
<% end %>

</div>
</div>

схема.rb

  create_table "locations", force: :cascade do |t|
    t.string "address"
    t.float "latitude"
    t.float "longitude"
  end

Я изменил код, включающий ответы других API, но безуспешно.Я чувствую, что это может быть из-за части кода def show, но я не слишком уверен.

1 Ответ

0 голосов
/ 17 октября 2018

Вы не указали, в каком действии контроллера вы столкнулись с этой ошибкой, однако, исходя из вашего кода, я полагаю, что это из метода show.Возможно, проблема в том, что вы пытаетесь не отображать макет, однако вы делаете это перед установкой переменной @locations.Поэтому Rails собирается рендериться до того, как будет создана переменная экземпляра.Чтобы исправить, вы должны переместить render :layout => nil строку в конец вашего метода после того, как переменные экземпляра были созданы, например:

def show
  @locations = Locations.find(params[:id])
  render :layout => nil
end

Однако я думаю, что вы, возможно, не полностью понимаете поток событийпроисходит здесь на основе имен ваших файлов.По умолчанию в конце действия контроллера Rails будет пытаться отобразить файл, ища имя файла, соответствующее действию контроллера, в папке представлений, соответствующей имени контроллера.Например:

app / controllers / books_controller.rb :

class BooksController < ApplicationController
  def index
    # Will automatically render `app/views/books/index.html.erb`
  end

  def show
    render :other_show_page # Will look for a file `app/views/books/other_show_page.html.erb` rather than `app/views/books/show.html.erb` because it was explicitly specified
  end
end

В вашем случае у вас есть файл с именем page.html.erb, но у вас нетдействие контроллера (def page; end), а также любые другие ваши действия, в частности, рендеринг файла с именем page.Поэтому Rails все равно не сможет найти ваш файл page.html.erb.Я предполагаю, что у вас есть файл show.html.erb, иначе вы получите другую ошибку, однако, если вы пытаетесь отобразить HTML из вашего файла page.html.erb, это не произойдет из-за вашего метода show, если выспециально отображать этот файл.

Несколько других примечаний ...

  • Модели обычно должны иметь имена в единственном, а не во множественном числе.Похоже, вы используете Locations в качестве названия вашей модели, а не Location.
  • Вашу переменную экземпляра в вашем show методе @locations, хотя вы используете запрос find ActiveRecord.Этот запрос возвращает один объект, а не коллекционный прокси многих объектов.Таким образом, ваше @locations именование переменных слегка вводит в заблуждение и может быть лучше, чем @location.
  • Если вы пытаетесь отобразить файл page.html.erb, когда вы нажимаете show метод, если только по какой-то конкретной причине вы это делаете, это ненужная и плохая практика.Вы должны просто включить код в файл show.html.erb и позволить Rails автоматически его визуализировать, а не создавать собственный файл, который вы рендерите специально.Rails - это соглашение о конфигурации, поэтому старайтесь изучать соглашения и следуйте им, пока у вас не будет веской причины отказаться от них.
...