0

我想像这样将link_to带有参数的调用放入控制器中(twitterauthorise路由中的参数):

def method
  "/authorise/twitter"
  ...
end

我不介意复制授权方法来实现它,但我不知道如何将twitter参数传递给该方法。

def authorise
  user = User.from_omniauth(current_user, env['omniauth.auth'])
  session[:user_id] = current_user.id
end

任何帮助都会很棒。谢谢!

更新

这是我试图在控制器方法中以某种方式复制的路线:

get '/authorise/:provider/callback', to: 'sessions#authorise'

这是from_omniauth方法:

def self.from_omniauth(user, auth)
  user.provider = auth.provider
  if auth.provider == "facebook"
    user.uid = auth.uid
    user.oauth_token = auth.credentials.token
    user.oauth_expires_at = Time.at(auth.credentials.expires_at)
  elsif auth.provider == "twitter"
    user.access_token = auth["credentials"]["token"]
    user.access_token_secret = auth["credentials"]["secret"]
  end
  user.save!
end

它应该传递'twitter'auth参数,但我收到此错误:

undefined method `provider' for "twitter":String
app/models/user.rb:82:in `from_omniauth'

感觉就像我应该传递一个哈希或类似的东西,但我不知道应该是什么。现在感觉就像是特定于 oauth 的东西。

4

2 回答 2

1

虽然您不能将参数传递给 rails 动作,但您确实可以将它们传递给控制器​​中的方法。

从你的问题退后一步,我相信你在问如何重用控制器方法。通常,您希望避免复制方法 - 保持DRY。我会将您的授权操作分解为一个单独的方法。

您的代码可能如下所示:

def new_method
  authorize_from_strategy('twitter')
end

def authozie #old method
  authorize_from_strategy
end

private 

def authorize_from_strategy(strategy=nil)
  user = User.from_omniauth(current_user, strategy || env['omniauth.auth'])
  session[:user_id] = current_user.id
end 

如果您想authorize_from_strategy在任何控制器中使用该方法,您可以将该私有操作移动到您的 application_controller。

session[:user_id]此外,如果您使用的是 devise 之类的东西,设置可能是多余的。设计已经将您的用户信息存储在会话中,这就是您访问current_user.

于 2013-10-15T03:49:58.853 回答
0

您不能为控制器操作传递参数,但可以将请求参数传递给控制器​​。所以像:

def method
  @twitter = Your_Model.find params[:twitter]
end

希望这可以帮助。

于 2013-10-15T03:26:09.940 回答