質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1235閲覧

Rails modelからcontrollerに値を渡したい

kenny_sayama

総合スコア1036

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/08/22 02:57

###前提・実現したいこと
User認証機能を作成していて、omniauthを使って各Providerからデータを取得してくるということをしています。
現状ではAPIからデータを取得するところまで出来ています。

実現したいこととしては、APIからデータを取得して、そのデータ保存せず保持したままnewメソッドまでデータを保持してrenderしたいです。

処理の流れは以下のような感じです。

    1. user.rbのfrom_omniauth_callback(auth)でデータを受け取る。

Ruby

1# model/user.rb 2def from_omniauth_callback(auth) 3 # インスタンスを作成 4 user = User.new 5 binding.pry 6 user.uid = auth[:uid] 7 user.email = auth[:info][:email] 8 user.nickname = auth[:info][:name] 9 user.first_name = auth[:info][:first_name] 10 user.last_name = auth[:info][:last_name] 11 user.status = statuses[:unconfirm] 12 binding.pry 13 # コントローラーに値を渡したい 14 return user 15 end
    1. users_controllerで処理

Ruby

1# controller/users_controller 2def omniauth 3 # @userにモデルからのuser変数を渡したい 4 @user = User.from_omniauth_callback(user) 5 # @userのデータを保持したままnewにrenderしたい 6 render :new 7end

なぜこのような処理がしたいかというと、Facebookログインはあくまで入力の補助という役割で、新規登録のビューに保持したデータを持ってきて、足りない必須項目をユーザーに入力してもらいたいと考えているからです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

自分がもしやるとすると、

controllers/users_controller.rb

  • 対象のユーザを設定(find)するget_user的なメソッドを作成し、newbefore_actionに登録する

models/user.rb

  • after_initializeでProviderからデータを取得してセットする

という感じでしょうか。
すれば、new時に@user.uidみたいに値が取得できるかと思います。

userには、Provider関連の情報以外にもDBに入っている情報もあると思います。
from_omniauth_callbackのようなユーザに紐付くProvider情報を返すクラスメソッドよりも、
userのinitialize時にそのユーザに紐付く全情報をattributeに持たせる方がシンプルかなと思います。
具体的なmodels/user.rbの実装イメージとしては、

# Userテーブルには存在しないが、Userに持たせたいデータを登録 attr_accessor :uid, ... # User.createやUser.find時に実行 def after_initialize get_provider_data end private # Providerデータ取得 def get_provider_data # データ取得 auth = API::Provider.get(user) # データセット user.uid = auth[:uid] : end

というような形などいかがでしょうか?

投稿2017/08/22 03:29

tashua314

総合スコア145

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問