Как работает «response_with_navigational»? - PullRequest
6 голосов
/ 21 июля 2011

Я работаю с Devise и DeviseInvitable для управления аутентификацией в моем приложении, и у меня возникают некоторые проблемы с добавлением поддержки AJAX в обновление InvitationsController #.Контроллер в DeviseInvitable выглядит следующим образом:

# 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

Это хорошо работает, когда resource.errors.empty? == true, и мы выполняем:

respond_with resource, :location => after_accept_path_for(resource)

(т.е. invitations / 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.

Спасибо!

1 Ответ

11 голосов
/ 22 июля 2011

ОК, я выяснил, что делает respond_with_navigational.Он определен в базовых классах Devise следующим образом:

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

и navigational_formats также определен в Devise:

# 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 отображается правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...