Рендеринг различных действий для ajax vs html-запроса в rails 3 - PullRequest
2 голосов
/ 03 февраля 2011

В рельсах три у меня есть следующий код для моего действия уничтожения в контроллере фотографий

 def destroy
      @photo = Photo.find(params[:id])
     if @photo.destroy
       flash[:notice] = t('photo.deleted')
       respond_to do |format|
         if request.xhr?
           format.js
         else
           format.html {redirect_to photos_path}
         end
       end
     else
       flash[:alert] = t('.photo.error_deleting')
       if request.xhr?
         redirect_to(photos_url)
       else
         redirect_to(photo_path @photo)
       end
     end
   end

Целью по сути является перенаправление на страницу индекса, если она вызывается из стандартной ссылки, и рендеринг уничтожения.JS, если вызывается из удаленной ссылки.Это работает, но мне было интересно, есть ли более чистый способ сделать это в rails 3. Возможно, с помощью оператора response_with?

Спасибо

1 Ответ

3 голосов
/ 04 февраля 2011

Это должно работать для вас:

respond_to :html, :js

def destroy
  @photo = Photo.find(params[:id])
  if @photo.destroy
    flash[:notice] = t('photo.deleted')
  else
    flash[:alert] = t('.photo.error_deleting')
  end

  respond_with(@photo)
end

Здесь есть хороший пост в блоге: http://ryandaigle.com/articles/2009/8/10/what-s-new-in-edge-rails-default-restful-rendering

Вот цитата из поста о логике:

Если был запрошен формат: html:

  • Если это был запрос GET, вызовите render (который отобразит шаблон представления для текущего действия)
  • Если это был запрос POST и у ресурса есть ошибки проверки, отобразите: new (чтобы пользователь мог исправить их ошибки)
  • Если это был запрос PUT и у ресурса есть ошибки проверки,render: edit (чтобы пользователь мог исправить свои ошибки)
  • Иначе, перенаправить на местоположение ресурса (т.е. user_url)

Если был запрошен другой формат (например:xml или: json)

  • Если это был запрос GET, вызовите метод: to_format для ресурса и отправьте его обратно
  • Если ресурс имеет ошибки проверки, отправьтеверните ошибки в запрошенном формате с кодом состояния: unprocessable_entity
  • IЕсли это был запрос POST, вызовите метод: to_format для ресурса и отправьте его обратно со статусом: selected и местоположением: вновь созданного ресурса
  • Иначе, отправьте ответ: ok без тела

Немного больше о to_format части из документации :

Сначала мы попробуем визуализировать шаблон, еслишаблон недоступен, мы проверяем, отвечает ли ресурс: to_format, и отображаем его.

Существует также Railscast: http://railscasts.com/episodes/224-controllers-in-rails-3

...