Передача данных между контроллерами с сеансом RESTful - PullRequest
2 голосов
/ 09 мая 2009

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

Мой сайт является своего рода дискуссионным форумом. Все ответы на обсуждения сделаны на контроллере Discussions # show page inline.

Некоторые ответы недействительны, однако - например, если вы попытаетесь опубликовать ответ, в котором нет текста, он вернет вас в DiscussionsController # show с сообщением об ошибке.

Вот краткое описание того, как я реализовал этот рабочий процесс:

  1. Пользователь заходит в дискуссионный контроллер # show. Этот шаблон имеет форму ответа. Не существует явного RepliesController # new action.
  2. Пользователь отправляет форму ответа, которая отправляется в replies_path и обрабатывается в RepliesController # create.
  3. RepliesController # create не может сохранить ответ, потому что он недействителен (validates_length_of в поле Reply делает объект недействительным).
  4. RepliesController # create помещает объект ответа в сессию [: new_reply] и перенаправляет на путь обсуждения_, откуда пришел пользователь.
  5. DiscussionsController # show обрабатывает объект сеанса ...

Вот так:

if session[:new_reply]
  @new_reply = session[:new_reply]
  session.delete(:new_reply)
end

А теперь в show.html.erb есть недавно регенерированный объект @new_reply для проверки на ошибки.

Что-то явно не так с этим - вы не должны хранить целые объекты внутри сеанса. Но поскольку объект Reply, который мы пытались сохранить в RepliesController # create, никогда не сохраняется, как мне сохранить его между вызовами действий контроллера?

Или, если есть более масштабное дизайнерское решение, не стесняйтесь им поделиться. Это так уродливо, это причиняет мне боль. Спасибо.

Ответы [ 3 ]

2 голосов
/ 10 мая 2009

Вместо сеанса я бы сохранял ответ во flash , что хорошо для передачи сообщений / объектов через действие.

Контроллер просто сохранит ответ во флэш-памяти, если он недействителен, и перенаправит:

if @reply.save
   ...
else
   flash[:reply] = @reply
end

И ваша логика формы на странице обсуждения / показа должна быть немного умнее и захватить ответ во флэш-памяти или новый (который, как я полагаю, вы создаете в процессе обсуждения / показа):

form_for(flash[:reply] || @reply) do
  ...
end
2 голосов
/ 09 мая 2009

Как насчет того, чтобы вместо перенаправления сделать render :action => "discussions/show" вместо этого. Я собирался сказать, что вам также нужно установить переменную @discussion, но это следует делать, поскольку ответы являются вложенными ресурсами внутри обсуждений, верно?

0 голосов
/ 18 сентября 2009

Я бы сказал, что то, как вы это делаете, разумно. Не самый чистый, но это ОТДЫХ.

Предложение Radar прекрасно, но в текущей версии Rails использование render :action => "discussions/show" не создает правильного поведения, по крайней мере в моих попытках, которые были без маршрутизации вложенных ресурсов. Использование render :controller => "discussions", :action => "show" дает другое поведение, не то, что ищет автор.

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