应用控制器中的全局变量?

时间:2013-09-01 13:17:10

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2

我用

抓住了第一个国家
 @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

2 个答案:

答案 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。