2016-04-02 4 views
0

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

class CryptController < ApplicationController 
    respond_to :json 

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

Поднимает: ** неопределенный метод persisted?' for nil:NilClass** [email protected]/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/polymorphic_routes.rb:298:in handle_list» /home/workstat/.rvm/gems/[email protected]/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/polymorphic_routes .rb: 206: in polymorphic_method' /home/workstat/.rvm/gems/[email protected]/gems/actionpack-4.2.5.1/lib/action_dispatch/routing/polymorphic_routes.rb:114:in polymorphic_url '

+0

Вы также можете сначала просмотреть свой код и ошибку? 'response_with' также работает с объектами AR. –

+0

@ArupRakshit Я обновил вопрос – DreamWalker

ответ

0

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

Из documentation

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 и this blogpost от José Valim.

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