我用
抓住了第一个国家 @country = Country.find(1)
然后我的头部导航我做这个循环以获得正确的标签:
%ul.thumbnails
- @country.tags.find_each(:conditions => "active_house = true") do |a|
%li.span2
.thumbnail
- a.attachments.limit(1).each do |b|
= image_tag(b.file.url)
.caption
%p
#{link_to a.url, tag_country_region_houses_path(@country, a.name), :class => 'btn-nav-drop'}
这很好用。但导航是全局的,所以我在application_controller中创建了一个方法,如下所示:
helper_method :tags
def tags
@country = Country.find(1)
@tags = @country.tags.find_each(:conditions => "active_house = true")
end
在导航视图中:
%ul.thumbnails
- tags do |a|
%li.span2
.thumbnail
- a.attachments.limit(1).each do |b|
= image_tag(b.file.url)
.caption
%p
#{link_to a.url, tag_country_houses_path(@country, a.name), :class => 'btn-nav-drop '}
但我收到错误消息“no block given(yield)”
Thanks..remco
答案 0 :(得分:1)
嗯,这与全局变量无关,应尽可能避免。
你的问题就在这一行
tag_country_houses_path(@country, a.name)
View中没有@country
。
你可能想知道为什么。原因是帮助程序无法将实例变量传递给View,与控制器不同。
你的助手所做的就是返回一个数组对象@tags
。该对象的值在视图中可用,但不是实例变量@tags
,也不是@country
。
修复?使用某些内容替换@country
。如果关联是国家has_many标签,您可以这样做:
tag_country_houses_path(a.country, a.name)
如果没有,您可以在标签模型中设置方法以获取国家/地区。
你甚至可以使用一些includes
来提高查询效率,但那是另一回事。
此外,您的帮助程序可以简化,而无需分配任何变量。
def tags
Country.find(1).find_each(:conditions => "active_house = true")
end
答案 1 :(得分:0)
find_each
接受将被收益的块。因为你在没有块的帮助器中编写find_each,所以它会抛出一个错误。你有两个解决方案。
解决方案1:您可以使用find返回数组。
def tags
Country.find(1).tags.find(:all, :conditions => "active_house = true")
end
在您看来:
- tags.each do |t|
.........
解决方案2:您可以将该块传递给您的助手。
def tags
Country.find(1).tags.find_each(:conditions => "active_house = true") do |t|
yield t
end
end
在你看来。
- tags do |t|
.........
如果您的记录不多,请使用solution1。