Передача атрибута модели в представление Rails с помощью redirect_to - PullRequest
5 голосов
/ 22 марта 2009

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

Вот код в моей модели:

attr_accessor :mode

#getter
def mode
 @mode
end

#setter
def mode=(val)
 @mode = val
end

... в контроллере:

@report.mode = "t"
redirect_to edit_report_path(@report)

... и на мой взгляд:

<%= build_report(@report.mode) %>

... но этот вспомогательный метод никогда не получает переменную, которую я только что установил в контроллере. Это ноль. Что дает? Понятно, что я здесь упускаю что-то простое, потому что кажется, что это должно быть просто. Любое понимание будет с благодарностью. Спасибо.

Ответы [ 3 ]

3 голосов
/ 22 марта 2009

edit_report_path создает URL с идентификатором @report.

redirect_to по сути создает новый запрос и переходит на этот URL. Когда он достигает edit, все, что у него есть, это идентификатор. Обычно это нормально - он ищет объект и продолжает работать, но, конечно, у него не будет установленного вами поля не-db.

Есть несколько способов это исправить. Вместо этого вы можете использовать: render для перехода на страницу редактирования - тогда в @report будет установлено поле.

@report.mode = "t"
render :action => edit and return

Или вы можете сделать mode полем базы данных.

2 голосов
/ 22 марта 2009

Проблема здесь в redirect_to. Когда вы перенаправляете куда-то еще, все переменные экземпляра теряются. Поэтому, когда вы устанавливаете @report.mode = "t", он устанавливает атрибут. Но при перенаправлении эти данные теряются.

Я предполагаю, что <%= build_report(@report.mode) %> находится в edit_report.html.erb, а код, когда вы устанавливаете 'mode', отсутствует в действии редактирования. В этом случае вы можете передать report.mode действию редактирования в URL, например:

 build_report(@report.mode, :mode => "t")
0 голосов
/ 22 марта 2009

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

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