Rails 4,设计 - after_sign_in

时间:2016-01-16 01:02:24

标签: ruby-on-rails redirect devise path omniauth

我正在尝试在Rails 4中创建一个应用程序。

我正在尝试按照本教程进行操作:  http://sourcey.com/rails-4-omniauth-using-devise-with-twitter-facebook-and-linkedin/

我已将om_sign_in_path从omniauth回调控制器移动到应用程序控制器,以便我可以扩展它。

我目前在应用程序控制器中的尝试是:

def after_sign_in_path_for(resource)
      if !resource.email_verified? 
          finish_signup_path(resource)
        elsif params[:redirect_to].present?
          store_location_for(resource, params[:redirect_to])
        elsif  request.referer == new_session_url
          profile_path(resource.profile) # or whatever the route is for the destination you want
        else
          store_location_for(resource) || request.referer || root_path 
      end 
    end

当我尝试这个时,我收到了这个错误:

ArgumentError in Users::OmniauthCallbacksController#linkedin
wrong number of arguments (0 for 1+)

它突出了上述方法的这一行:

elsif  request.referer == new_session_url

我不知道此错误消息的含义。

我的回调控制器有:

def self.provides_callback_for(provider)
    class_eval %Q{
      def #{provider}
        @user = User.find_for_oauth(env["omniauth.auth"], current_user) 

        if @user.persisted?
          sign_in_and_redirect @user,  event: :authentication

          set_flash_message(:notice, :success, kind: "#{provider}".capitalize) if is_navigational_format?
        else
          session["devise.#{provider}_data"] = env["omniauth.auth"]
          redirect_to new_user_registration_url
        end
      end
    }
  end

这是将omniauth_callbacks控制器中的方法移出应用程序控制器吗?

谁能看到我做错了什么?

我的会话路线是:

new_user_session GET       /users/sign_in(.:format)                          devise/sessions#new
            user_session POST      /users/sign_in(.:format)                          devise/sessions#create
    destroy_user_session DELETE    /users/sign_out(.:format)                         devise/sessions#destroy

考虑到TOM的建议,我将应用程序控制器中的重定向方法更改为:

  def after_sign_in_path_for(resource)
      if !resource.email_verified? 
          finish_signup_path(resource)
        elsif params[:redirect_to].present?
          store_location_for(resource, params[:redirect_to])
        elsif  request.referer == new_session_path(:user)
          profile_path(resource.profile) # or whatever the route is for the destination you want
        else
          stored_location_for(resource) || request.referer || root_path 
      end 
    end

问题在于,当我尝试登录时,我希望转到用户的个人资料显示页面。相反,我去了根路径。将(:user)添加到第二个elsif语句的末尾似乎导致了这种情况的发生。那不是我想要的。

任何人都可以看到如何设置在此上下文中工作的路径吗?

1 个答案:

答案 0 :(得分:1)

Devise提供new_session_path / url,它将资源名称作为参数

elsif request.referer == new_session_url(:user)
例如