2011-07-21 22 views
6

私はDeviseとDeviseInvitableを使ってアプリケーションの認証を管理していますが、InvitationsController#updateにAJAXサポートを追加する際に問題があります。 DeviseInvitableのコントローラは次のようになります。これがうまくときresource.errors.empty? == trueを動作し、我々は実行「respond_with_navigational」はどのように機能しますか?

# invitations_controller.rb 

# PUT /resource/invitation                         
def update 
    self.resource = resource_class.accept_invitation!(params[resource_name]) 

    if resource.errors.empty? 
    set_flash_message :notice, :updated 
    sign_in(resource_name, resource) 
    respond_with resource, :location => after_accept_path_for(resource) 
    else 
    respond_with_navigational(resource){ render_with_scope :edit } 
    end 
end 

respond_with resource, :location => after_accept_path_for(resource) 

(すなわち、招待状/ update.js.erbがレンダリングされると、私のjavascriptのコールが行われました)。問題は、そのときresource.errors.empty? == falseであり、我々は実行します。

respond_with_navigational(resource){ render_with_scope :edit } 

サーバーは言う:

Rendered invitations/update.js.erb (1.4ms) 

が、私のjavascriptの呼び出しは実行されません。 respond_with_navigationalさんはしていることを説明できますか?私は何時間もグーグルで遊んでいましたが、どこにでもこのapiの説明が見つかりませんでした。

ありがとうございます!

答えて

10

いいえ、私はrespond_with_navigationalがやっていることを理解しています。次のような工夫基底クラスで定義されています:

def respond_with_navigational(*args, &block) 
    respond_with(*args) do |format| 
     format.any(*navigational_formats, &block) 
    end 
end 

と、navigational_formatsも同様工夫に定義されています。

# Returns real navigational formats which are supported by Rails 
def navigational_formats 
    @navigational_formats ||= Devise.navigational_formats.select{ |format| Mime::EXTENSION_LOOKUP[format.to_s] } 
end 

だから、それは基本的にrespond_with()のラッパーです。この作業を取得するためには、私は私のInvitationsControllerに以下を追加する必要がありました:

respond_to :html, :js 

、今、update.js.erbは適切にレンダリングされています。

+0

この回答のためにここに来た:http://stackoverflow.com/a/9154096/18706(誰でもそれを使用する実用的な例を探している場合)。 – mahemoff

+0

また、これはデフォルトイニシャライザの説明です:https://gist.github.com/3824340 – mahemoff

関連する問題