2009-12-22 4 views
3

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

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

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

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

Спасибо!

ответ

2

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

+0

я позабавиться с маршрутами ... это может заставить меня туда, где я хочу быть , – thomas

0

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

0

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

1

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

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

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

+0

Самым ресурсом является Песня, но я не хочу, чтобы URL-адреса отображали словосочетание ... Я пытаюсь создать страницу рекомендаций для свадьбы на свадьбе, и я хочу, чтобы у вас был URL-адрес/музыка или что-то подобное, что отображает куча песен. Думая дальше, я мог просто добавить маршрут к карте/музыке: controller => 'songs',: action => 'index'. – thomas

1

Если вы начинаете работать по краю, the ability to pass a flash through a redirect was just added ... но это вас действительно не доставит.

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

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 для успешной загрузки списка всей песни.