Rails: response_with пользовательский объект

response_with предназначен для использования с ActiveModelэкземпляры Я пытался использовать его с OpenStructпример, но это вызывает ошибку. Возможно ли когда-либо использовать response_with с пользовательскими объектами?

class CryptController < ApplicationController
  respond_to :json

  def my_action
    respond_with OpenStruct.new(foo: 'foo', bar: 'bar')
  end
  # ...
end

Повышает: ** неопределенный метод persisted?' for nil:NilClass** ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/polymorphic_routes.rb:298:inhandle_list '/home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/polymorphic_routes.rb:206:in polymorphic_method' /home/workstat/.rvm/gems/ruby-2.1.4@rails4/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/polymorphic_routes.rb:114:inpolymorphic_url"

1 ответ

Решение

respond_with вспомогательный метод, который предоставляет ресурс для запросов MIME.

Из документации

 respond_with(@user)

для create действие эквивалентно (при условии respond_to :xml в примере) чтобы:

respond_to do |format|
    if @user.save
      format.html { redirect_to(@user) }
      format.xml { render xml: @user, status: :created, location: @user }
    else
      format.html { render action: "new" }
      format.xml { render xml: @user.errors, status: :unprocessable_entity }
    end
  end
end

Точный эквивалент зависит от действия контроллера.

Ключевым выводом является то, что respond_with принимает переменную @instance в качестве аргумента и сначала пытается перенаправить к соответствующему представлению html. В противном случае он создает ответ XML, в случае выше.

Вы передаете в ostruct, которая не соответствует экземпляру вашей модели. В этом случае, respond_with не знает, куда перенаправить в ваших представлениях, и не имеет экземпляра, из которого можно вывести ответ MIME.

Смотрите этот RailsCast и этот пост от Хосе Валима.

Примечание: ошибка undefined method persisted? генерируется Devise и, вероятно, потому что он не может найти маршрут.

Другие вопросы по тегам