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:in
handle_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:in
polymorphic_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 и, вероятно, потому что он не может найти маршрут.