0

link_to次のように、引数を指定して呼び出しをコントローラーに入れたい(twitterauthoriseルート内の引数です):

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

twitterこれを実現するために authorize メソッドをコピーしてもかまいませんが、そのメソッドに引数を渡す方法がわかりません。

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 などを使用している場合、設定が冗長になる可能性があります。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 に答える