我正在努力探索太阳黑子,并且无法在太阳黑子搜索结果中访问相关模型中的数据。
我有一个包含字段的房间模型:id,room_name,capacity,location_id。它看起来像这样:
class Room < ActiveRecord::Base
belongs_to :location
searchable do
text :room_name
end
end
带有字段的位置模型:id,location_name。它看起来像这样:
class Location < ActiveRecord::Base
has_many :rooms
end
我有一个如下所示的搜索控制器:
class SearchController < ApplicationController
def later
@search = Sunspot.search(Room)
@results = @search.results
end
end
我正在尝试渲染一个看起来像这样的视图:
<% @results.each do |result| %>
<%= result.room_name %>
<%= result.capacity %>
<%= result.location.location_name %>
<% end %>
但是,当我访问/搜索/稍后
时,我收到以下错误NoMethodError in Search#later
Showing ./app/views/search/later.html.erb where line #4 raised:
undefined method `locations' for #<Room id: 1, room_name: "Room 1", capacity: 6, location_id: 1>
如果没有第4行这完美地运作,问题似乎在于我正在接触位置模型。
我的理解是@results
变量应该是一个有效的ActiveRecord对象,并允许我从相关模型访问数据,在本例中是Location?
答案 0 :(得分:0)
因此,Rubyist的回答是可行的。但是,直到我在routes.rb中取消嵌套Rooms资源,它才能工作。
我不明白为什么嵌套路线会导致问题。
答案 1 :(得分:0)
你在Sunspot和Solr方面所做的任何事都没有错。
您的观点中的错误是因为您在Room对象上调用locations
,它应该是location
(因为房间属于某个位置)。
关于undefined method location_name for nil
的错误是因为您尝试索引的Room实例没有关联的位置(即@ room.location为nil)。您可以将索引放在条件中(例如。location.location_name if location.present?
或使用类似try
的内容(例如location.try(:location_name)
)。