Rails вызывает действие из вида - PullRequest
3 голосов
/ 17 февраля 2011

Надеюсь, у меня есть простой вопрос, но я, кажется, не могу найти ответ.Просто начал работать с RoR, но раньше пришел из ASP MVC.У меня проблема с отображением частичных представлений, локальные переменные которых не обязательно связаны с переменными основного представления.Например, в блоге я пытаюсь создать боковую панель, которая будет ссылаться на архив.

def sidebar
  @blog_posts = Blog.all(:select => "created_at")
  @post_months = @blog_posts.group_by { |m| m.created_at.beginning_of_month }
end

Частичное представление _sidebar выглядит следующим образом:

<div class="archives">
  <h4>Blog Archive</h4>
    <% @post_months.sort.reverse.each do |month, posts| %>
    <%= link_to "#{h month.strftime("%B %Y")}: #{posts.count}", archive_path(:timeframe => month) %>
<% end %>
</div>

Проблема, с которой я сталкиваюсь, заключается в том, что если я просто выполняю рендеринг 'боковой панели' в моем основном виде, действие некажется, что он вызывается и @post_months всегда ноль.Можно ли вызвать действие прямо из представления и просто отобразить эту «боковую панель»?В ASP MVC я обычно делал боковую панель ChildActionOnly и Render.Action из основного обзора, но в RoR я совершенно не в курсе.Любая помощь приветствуется!

1 Ответ

1 голос
/ 17 февраля 2011

Я думаю, что здесь происходит то, что ваша боковая панель обрабатывается как частичная, а ваш метод контроллера никогда не вызывается. В этом случае я бы поместил код, который в настоящее время содержится в методе контроллера боковой панели, либо в модуль ApplicationHelper, либо во вспомогательный модуль текущего представления, в зависимости от того, нужно ли отображать боковую панель из других представлений.

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

Module SomeModule
  def blog_posts
    Blog.all :select => "created_at"
  end

  def post_months
    blog_posts.group_by { |m| m.created_at.beginning_of_month }
  end
end

Конечно, это вполне может потребовать рефакторинга и может работать не так, как написано, но это общая идея, с которой я бы согласился.

Удачи.

...