Действие рендеринга Rails в другом контроллере - PullRequest
3 голосов
/ 23 декабря 2009

Итак, у меня есть контроллер Music с одним действием index. На странице music/index.html я перечисляю кучу песен (через модель песни), а внизу у меня есть для создания новой песни.

У песни есть проверки, которые я проверил, и они отлично работают. Когда новая песня сохраняется в действии Songs контроллера, создайте I redirect_to => 'music_index_path', чтобы человек мог видеть новую песню в списке. Однако когда песня не сохраняется (не проходит валидацию), я не могу использовать redirect_to, так как форма error_messages не переносится Мне нужно использовать render, но я не могу сказать render :controller => 'music', :action => 'index.

Моя цель - показать сообщения об ошибках для формы песни на странице music / index.html.

Как мне поступить об этом. Я открыт для других идей (например, для смены контроллеров).

Спасибо!

Ответы [ 7 ]

2 голосов
/ 23 декабря 2009

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

1 голос
/ 24 августа 2017

Хотя я хочу повторить то, что другие говорили о вашей ресурсной архитектуре, заслуживающей второго взгляда, вы, конечно, можете отображать представления для других ресурсов, используя параметр :template :

render template: 'music/index'
1 голос
/ 23 декабря 2009

Если вы начинаете работать на грани, добавлена ​​возможность пропускать флеш через перенаправление ... но это вас на самом деле не дает.

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

def index
  setup_for_index
end

def create
   @song = Song.new(params[:song])
   @song.save
   #...
   #on failure
     setup_for_index
     render :controller => "music", :action => "index"
end

def setup_for_index
  @songs = Song.all
  #etc
end

Другая вещь, которую вы могли бы сделать, это использовать form_remote_for и иметь форму песни, просто обновляющую div при неудаче. Затем используйте возвращаемый тип шаблона RJS, чтобы перезагрузить весь список песен в случае успеха.

1 голос
/ 23 декабря 2009

Моя первая мысль - нам нужно переосмыслить этот процесс. Предполагая, что вы используете контроллеры RESTful, мне непонятно, зачем вам нужен контроллер Music и контроллер Song ... чем отличаются эти ресурсы? Следующий важный вопрос: почему недостаточно показать ошибки с помощью Song # create? Я имею в виду, они не могли сделать это правильно, когда это была просто форма, может ли отвлечение дополнительного контента помочь? :)

С учетом сказанного, вот возможное решение. (Учитывая, что вы не вставляли свой код, я делаю много предположений здесь.)

<hack> сначала извлеките части формы из песен / новичков в песни / _form, затем из представления музыка / указатель, render: частичный => песни / _form и в контроллере песен, render: action => '../music/index '(это называется hackity-hack.) Поскольку это хак, вам почти наверняка нужно будет зайти в music # index и добавить @song = Song.new </hack>

0 голосов
/ 23 декабря 2009

Вы можете попробовать render :file => ...

0 голосов
/ 23 декабря 2009

Вы также можете попробовать использовать flash[:song_save_error], чтобы передать условия ошибки обратно на музыкальный контроллер.

http://api.rubyonrails.org/classes/ActionController/Flash.html

0 голосов
/ 23 декабря 2009

Почему бы не простой if request.post? условно в виде действия индекса вместо перенаправления на другую страницу?

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