0

Я грейферы первой страной сглобальная переменная в контроллере приложения?

@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 '} 

Но я получаю сообщение об ошибке «не блокировать данный (выход)»

Thanks..remco

ответ

1

Ну, это ничего общего с глобальной переменной, которой следует избегать, когда это возможно.

Ваша проблема в этой строке

tag_country_houses_path(@country, a.name) 

Существует NO @country не существует View.

Вы можете задаться вопросом, почему. Причина заключается в том, что хелпер не может передавать переменные экземпляра в 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 
0

find_each принимает блок, который будет уступлен. Потому что вы пишете find_each в помощнике без блока, поэтому он выдает ошибку. У вас есть два решения.

Решение1: Вы можете просто использовать find для возврата массива.

def tags 
    Country.find(1).tags.find(:all, :conditions => "active_house = true") 
end 

на ваш взгляд:

- tags.each do |t| 
    ......... 

Solution2: вы можете передать блок вашим помощником.

def tags 
    Country.find(1).tags.find_each(:conditions => "active_house = true") do |t| 
    yield t 
    end 
end 

с вашего мнения.

- tags do |t| 
    ......... 

Если у вас не так много записей, просто используйте solution1.

Смежные вопросы