Есть ли более элегантный способ? (доступ к контроллеру рельсов со статической домашней страницы?) - PullRequest
0 голосов
/ 09 февраля 2012

ОК, это работает, но я чувствую, что есть лучший способ сделать это в Rails ... У меня есть домашняя страница, которая, если вы еще не вошли в систему, не в настоящее время что-либо вытягиваетот любой модели или контроллера.Он существует по адресу /pages/home.html.erb

. На этой странице я хочу взять следующую партию из модели моей партии и рассказать посетителю сайта об этой партии.Достаточно просто, верно?:

/ app / controllers / party_controller.rb

def nextparty
  @party = Party.find(:first, :order => "begins_on")
end

Теперь на своей домашней странице я использовал this и работает нормально:

/ app / views / pages / home.html.erb

<% @PartyCont = PartiesController.new() %>
<% @party = @PartyCont.nextparty() %>
<h3>The next party is <%= @party.name %></h3>

Я пробовал вспомогательные методы, partials, ApplicationHelper, но этобыл единственный код, который на самом деле работал .Большинство других вещей, которые я пробовал, казалось, не сработало, потому что класс @Party не был создан (как правило, ошибка указывала на класс с временным именем и «неопределенным методом»).

Эй, я счастлив, что этоработает, но я чувствую, что в Rails есть лучший способ.Я видел несколько постов, в которых используется код, подобный приведенному выше примеру, а затем говорится: «Но вам действительно не нужно когда-либо делать это!».

Это нормально, илиЕсть ли более Rails-подобный способ?

ОБНОВЛЕНИЕ: Я думаю, что проблема не просто в элегантности ... Я только что понял, что все тесты RSPEC, попавшие на домашнюю страницу, терпят неудачу с:

Failure/Error: get 'home'
 ActionView::Template::Error:
  undefined method `begins_on' for nil:NilClass

Спасибо!

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Вам нужен контроллер за каждым представлением, и вы не хотите, чтобы представления пересекали границы контроллера для представления информации. Подумайте о том, чтобы иметь контроллер приветствия (или как вы предпочитаете его называть). Может иметь индексное действие:

def index
  @party = Party.find(:first, :order => "begins_on")
end

В config / rout.rb сделайте это действие корневого контроллера:

root :to => "welcome#index"

Кроме того, для СУШКИ добавьте метод класса .nextparty в модель Party и вызовите его из обоих действий вашего контроллера вместо метода find.

0 голосов
/ 09 февраля 2012

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

Там должен быть следующий код:

def index
  @party = Party.find(:first, :order => "begins_on")
end

Этот метод экземпляра будет доступен в вашемсоответствующее представление app / views / party / index.html.erb

<h3>The next party is <%= @party.name %></h3>

Чтобы сделать его доступным в качестве домашней страницы, вам также потребуется настроить свой маршрут: config /route.rb

root :to => "parties#index"

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

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

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