Ruby on rails RubyonRails-未定义的方法'each';对于nil:NilClass错误
我已经检查了我的具体错误的API,提供的答案无法解决我的问题 我只是在尝试一个在线获得的“查找最近位置”代码,我的问题是,当我将此代码实现到一个项目中时,我获得了“未定义的方法`each'for nil:NilClass error” 我理解这个错误是因为,当调用@something时,它没有定义。这是我正在处理的代码和文件: locations.rbRuby on rails RubyonRails-未定义的方法'each';对于nil:NilClass错误,ruby-on-rails,ruby,rails-geocoder,Ruby On Rails,Ruby,Rails Geocoder,我已经检查了我的具体错误的API,提供的答案无法解决我的问题 我只是在尝试一个在线获得的“查找最近位置”代码,我的问题是,当我将此代码实现到一个项目中时,我获得了“未定义的方法`each'for nil:NilClass error” 我理解这个错误是因为,当调用@something时,它没有定义。这是我正在处理的代码和文件: locations.rb class Nearby_Location < ActiveRecord::Base geocoded_by :full_addres
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
我已经修改了包含其他API答案的代码,但没有成功。我觉得这可能是由于代码中的def show部分,但我不太确定 您没有指定您在哪个控制器操作中遇到此错误,但是根据您的代码,我猜它来自
show
方法。问题可能是您试图不渲染布局,但是您是在设置@locations
变量之前执行此操作的。因此,Rails将在创建实例变量之前进行渲染。要修复此问题,应在创建实例变量后,将render:layout=>nil
行移到方法的末尾,例如:
def show
@locations = Locations.find(params[:id])
render :layout => nil
end
但是,我认为,根据文件名,您可能无法完全理解此处发生的事件流。默认情况下,在控制器操作结束时,Rails将尝试通过从与控制器名称匹配的视图文件夹中查找与控制器操作匹配的文件名来呈现文件。例如:
app/controllers/books\u controller.rb:
class BooksController
在本例中,您有一个名为page.html.erb的文件,但没有控制器操作(def page;end
),也没有任何其他操作专门呈现名为page
的文件。因此,Rails无论如何都无法找到您的page.html.erb
文件。我假设您确实有一个show.html.erb
文件,否则您将得到一个不同的错误,但是如果您试图从page.html.erb
文件中呈现html,除非您专门呈现该文件,否则它不会从show
方法中发生
还有一些其他的注释
- 模型的名称通常应为单数,而不是复数。您似乎使用了
位置
作为型号名称,而不是位置
- 您的
show
方法@locations
中的实例变量,尽管您使用的是find
ActiveRecord查询。此查询返回单个对象,而不是多个对象的集合代理。因此,您的@location
变量命名有点误导性,并且可能会比@location
更好
- 如果在点击
show
方法时试图呈现page.html.erb
文件,除非有特定原因,否则这样做是不必要的,也是不好的做法。您应该只将代码包含在一个show.html.erb
文件中,让Rails自动呈现它,而不是创建一个专门呈现的自定义文件。Rails是惯例而不是配置,所以试着学习惯例并遵循它们,直到你有一个很好的理由打破它们
呈现页面的动作是什么?
模板?您在那里定义了@位置吗?您好,我现在正在处理代码,所以页面模板代码就是这样。实际上,我是RubyonRails新手,所以我不认为@locations是在这里定义的。如果是这样的话,我该怎么做呢?您需要在控制器操作中定义任何变量,以便能够在视图-模板中使用它。由于没有页面操作,我不确定如何呈现这样的模板,您能详细说明一下吗?正如我提到的,我对RubyonRails还是新手。但是,阅读您所说的,我如何生成页面操作?实际上,根据上面的代码,我没有生成脚手架,我只是手动将每个文件添加到相应的文件夹中,因此可能会出现这些问题。下面的答案似乎有您的解决方案。以后遇到异常时,请始终附加堆栈跟踪。为每个人保存发生错误的猜测游戏
<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>
create_table "locations", force: :cascade do |t|
t.string "address"
t.float "latitude"
t.float "longitude"
end
def show
@locations = Locations.find(params[:id])
render :layout => nil
end
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