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

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

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

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

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

837閲覧

Rails twitter webapi 検索結果をDBに保存する処理

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/05/31 03:37

編集2021/05/31 11:21

Railsアプリを作成中の段階でTwitterapiのユーザ検索結果をTweetモデルに保存したいと考えています。
保存する値はname,screen_nameです。
new,createアクションをどのように記述すればDBに保存することができるのかわからない状態です。

controller

1class TweetsController < ApplicationController 2 def new 3 @user = [] 4 client = Twitter::REST::Client.new do |config| 5 # 事前準備で取得したキーのセット 6 config.consumer_key = ENV["TWITTER_API_KEY"] 7 config.consumer_secret = ENV["TWITTER_API_SECRET"] 8 config.access_token = ENV["TWITTER_ACCESS_TOKEN"] 9 config.access_token_secret = ENV["TWITTER_ACCESS_SECRET_TOKEN"] 10 end 11 @result = client.user(params[:screen_name]) 12 tweet = Tweet.new(read(@result)) 13 @user << tweet 14 end 15 16 def create 17 @result = Tweet.save 18 19 end 20private 21 22 def read(result) 23 screen_name = result['screen_name'] 24 name = result['name'] 25 { 26 screen_name: screen_name, 27 name: name, 28 } 29 30 end 31end
tweets/new.html.erb <div class='content'> <div id="search-box"> <%= form_tag('/tweets/new', method: :get) do %> <%= text_field_tag :screen_name, nil, name: "screen_name", placeholder: "キーワードを打ち込んでください", style: "width: 200px;"%><button title="検索" type="submit">検索</button> <% end %> </div> <div id='tweet_list'> <% if @result.present? %> <h2>検索結果</h2> <ul> <div class="list"> <li>スクリーンネーム名:<%= @result.screen_name %> </li> <li>氏名:<%= @result.name %> </li> </ul> </div> <% end %> <%= form_tag(tweets_path) do %> <%= hidden_field_tag :screen_name, @result.screen_name %> <%= submit_tag 'save' %> <% end %> </ul> </div>

イメージ

恐れ入りますがもしわかる方がいたらアドバイスをいただけないでしょうか。
よろしくお願いします。

[追記]

schema.rb create_table "tweets", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| t.string "name" t.string "screen_name" t.datetime "created_at", null: false t.datetime "updated_at", null: false end

[追記]

tweets_controller.rb class TweetsController < ApplicationController def new @user = [] client = Twitter::REST::Client.new do |config| # 事前準備で取得したキーのセット config.consumer_key = ENV["TWITTER_API_KEY"] config.consumer_secret = ENV["TWITTER_API_SECRET"] config.access_token = ENV["TWITTER_ACCESS_TOKEN"] config.access_token_secret = ENV["TWITTER_ACCESS_SECRET_TOKEN"] end @result = client.user(params[:screen_name]) tweet = Tweet.new(read(@result)) @user << tweet end def create @result = Tweet.new(tweet_params) @result.save end private def read(result) screen_name = result['screen_name'] name = result['name'] { screen_name: screen_name, name: name, } end def tweet_params params.require(:tweet).permit(:screen_name,:name) end end
tweets/new.html.erb <div class='content'> <div id="search-box"> <%= form_tag('/tweets/new', method: :get) do %> <%= text_field_tag :screen_name, nil, name: "screen_name", placeholder: "キーワードを打ち込んでください", style: "width: 200px;"%><button title="検索" type="submit">検索</button> <% end %> </div> <div id='tweet_list'> <% if @result.present? %> <h2>検索結果</h2> <ul> <div class="list"> <li>スクリーンネーム名:<%= @result.screen_name %> </li> <li>氏名:<%= @result.name %> </li> </ul> </div> <% end %> <%= form_tag(tweets_path) do %> <%= hidden_field_tag :screen_name, @result.screen_name %> <%= hidden_field_tag :name, @result.name %> <%= submit_tag 'save' %> <% end %> </ul> </div>

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

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

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

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

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

guest

回答1

0

ベストアンサー

newは不要ですね。
表示してる画面がそれ相当になります。
そのsaveボタンでcreateなのですが、、、

検索結果を表示しているview と それを表示させている action を載せて頂けますか。それがある方が具体的な話ができます
model Tweet はもう出来ているのですね?念の為そのschemaも載せてください

追記
formの中に screen_nameしかないですが、name も入れてください。
create にて @tweet = Tweet.new(tweet_params) してこれをsaveすれTweetに新しいのがつくられます。tweet_params はどうしたらよいか、はまず調べてください。

ただ、この方法の問題は、同じ人を何度も検索し[SAVE]するとそのたびに追加されてしまうこと。
Tweetは何をもってユニークとしていますか?それによって、 Tweet.new周りに工夫が必要になります。

投稿2021/05/31 06:32

編集2021/05/31 09:23
winterboum

総合スコア23284

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

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

退会済みユーザー

退会済みユーザー

2021/05/31 06:44

ご回答ありがとうございます! テーブルの構造については編集をして載せました。 現状はtweets/new画面でTwitterのスクリーンネームを入力すると存在していれば name,screen_nameが返るのでview,action共に質問に載せているのが現状全てとなります。
退会済みユーザー

退会済みユーザー

2021/05/31 11:25

追記ありがとうございます。 createアクションとviewの修正をしてsaveボタンより送信したのですが エラーでparam is missing or the value is empty: tweetでモデルに値が送られ無いです。。 私の方が修正する部分を間違えていると思うので、追記した内容を見ていただいてもよろしいでしょうか? よろしくお願いします。
退会済みユーザー

退会済みユーザー

2021/06/01 00:43

tweets/new.html.erbのhidden_field_tagに <%= hidden_field_tag "tweet[screen_name]", @result.screen_name %>とすることでTweetモデルに保存することができました! ですがまだ工夫しないと何度もsaveできてしまうのでそこは今後の課題とします。 今回はありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問