Как я должен структурировать действия контроллера, которые совместно используют шаблоны? - PullRequest
0 голосов
/ 01 февраля 2010

Допустим, у меня есть модель User и модель Invoice с ассоциацией belongs_to :user.

Теперь я создаю new действие для моего InvoicesController и представление, которое будет отображено. Представление будет иметь элемент select для выбора пользователя, которому будет принадлежать этот счет.

Так что мне нужно где-то получить этих пользователей; мой инстинкт должен оставить такие вещи вне поля зрения. Я заканчиваю с этим:

def new
  @users = User.all
end

Действие отправки формы: create. Когда по какой-то причине создание не удается, я перерисовываю представление действия new.

def create
  invoice = Invoice.new params[:invoice]
  if invoice.save
    flash[:notice] = 'Invoice created!'
    redirect_to :action => 'show', :id => invoice.id
  else
    @users = User.all
    render :action => 'new'
  end
end

Но, как вы видите, для повторного рендеринга действия new я должен снова вызвать пользователей.

Это всего лишь пример, но учтите, что у меня есть несколько форм с несколькими элементами select, заполненными из базы данных, или аналогичными конструкциями. Это превращается в ужасное количество повторений.

Так как мне структурировать свой контроллер в этой ситуации?

  • Должен ли я просто использовать User.all с моей точки зрения?
  • Должен ли я позвонить new из create, чтобы сделать выборку для меня?
  • Или что-то еще?

Ответы [ 2 ]

2 голосов
/ 01 февраля 2010

Для этого я бы использовал before_filter. Например, вы бы сделали что-то вроде:

  before_filter :fetch_all_users, :only => [:new, :create]

protected

  def fetch_all_users
    @users = User.all
  end

Для 90% моих контроллеров я использую плагин унаследованных ресурсов . Он сокращает объем кода контроллера, который необходимо написать для контроллеров CRUD, что также означает, что вы можете сократить количество тестов, которые необходимо написать.

0 голосов
/ 28 ноября 2010

Для меня:

Какой способ загрузить другие коллекции моделей для новых, отредактировать обновление и создать действия?

Это не очень хороший подход для моей ситуации. Где после «.save» я отправляю redirect_to другому действию, если я использую before_filter и «.save» возвращает true, fetch_all_users называется ненужным

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