【问题标题】:Rails: call link_to in a controllerRails:在控制器中调用 link_to
【发布时间】:2013-10-22 18:06:13
【问题描述】:

我想将带有参数的 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 的东西。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 model-view-controller oauth


    【解决方案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。

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

    【讨论】:

    • 这绝对是正确的轨道。不过,传递字符串似乎失败了,我不知道为什么。请问...=nil部分是做什么的?
    • =nil 表示您可以选择提交默认值。如果参数不存在,则使用默认值。我犯了一个错误(上面更新)。私有方法的第一行应该有一个可选的回退。我的意思是添加一个(current_user, strategy || env['omniauth.auth'])
    • 我不确定你所说的字符串失败是什么意思。另外,这里有一篇关于 ruby​​ 参数的文章,可能对您有用:skorks.com/2009/08/method-arguments-in-ruby
    • 它在from_omniauth 中失败,因为'twitter' 似乎是一个字符串。但由于它在初始链接的视图中是一个字符串,我不确定将其更新为什么。我会详细更新问题。
    【解决方案2】:

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

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

    希望这会有所帮助。

    【讨论】:

    • 这确实有点道理,但我试图将twitter 发送到授权方法,而不是使用这些参数检索记录。在这种情况下,Your_Model 不存在,只有一个控制器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多