где разместить код контроллера для партиалов, которые вы визуализируете из разных представлений в Ruby on Rails - PullRequest
0 голосов
/ 29 августа 2010

Вопрос новичка:

У меня есть часть, которую я загружаю на веб-сайт на разных страницах.

Эта часть нуждается в данных, поэтому в контроллере родительского представления явыполнить запрос: @properties = Property.find (: все)

Я передаю результаты запроса частичному в представлении, используя: locals

Теперь я хотел бы отобразить тот же частичныйс другой точки зрения.Это представление имеет другой контроллер.Должен ли я повторить запрос в этом контроллере тоже?Или я могу иметь отдельный контроллер для частичных, я использую еще одно место на сайте.В этом последнем случае, как мне указать, какой контроллер использовать в представлении, когда я помещаю команду рендеринга?

Или я должен использовать нечто, отличное от частичных, для этого вида использования?

ВидС уважением, Майкл

Ответы [ 2 ]

2 голосов
/ 29 августа 2010

Как бы я решил эту проблему, это определить новый файл внутри вашей папки lib со значимым именем.Сейчас я просто буду использовать does_as_shared.rb:

module DoesAsShared
  def setup_shared_data
    @shared_data = ...do something useful here ...
  end
end

, а затем внутри ваших контроллеров, которым нужен код, который вы пишете:

class ThingsController < ApplicationController
  include DoesAsShared

  def index
    setup_shared_data
    .. and do some more stuff ...
  end
end

Преимущество этого кода в том, что общий кодограничено теми контроллерами, которые действительно нуждаются в этом.И в то же время он довольно читабелен: оператор включения, учитывая, что имя выбрано правильно, четко указывает, какие функции включены.

1 голос
/ 29 августа 2010

Вам не нужно копировать код для настройки данных партиала, но вам нужно поднять его в контроллер, от которого унаследованы два ваших контроллера.Обычно это будет ваш ApplicationController.Определите там метод, который загружает нужные вам данные.Например:

class ApplicationController < ActionController::Base
  # ... your code ...

protected

  def load_partial_data
    @properties = Property.find(:all)
  end

end

Теперь для фактического вызова этого метода у вас есть две опции:

  1. Если эти данные нужны всем вашим контроллерам, добавьте before_filter к вашему ApplicationControllerкак before_filter :load_partial_data
  2. В противном случае добавьте before_filter к просто контроллерам, которые действительно должны загрузить данные.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...