🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Q&A

2回答

320閲覧

rails indexページのデータを取ってきて保存したい

tori315

総合スコア21

Ruby on Rails 5

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

0グッド

0クリップ

投稿2019/12/15 09:29

入力したデータを一覧にしたindexページから、クリックしたらそのデータをもってくるようにしたとき、
コントローラで

def acceptednew
@post = Post.find_by(id: params[:id])
@posted_id = @post.id
@accept = Accept.new(
user_id:@current_user.id,
post_id:@posted_id
)
@accept.save
redirect_to("/users/#{@current_user.id}")
end

にしました。

acceptテーブルにuser_idと post_idは保存できるようになったのですが、
id|user_id|post_id|created_at|updated_at
7|26|26|2019-12-15 08:22:28.060476|2019-12-15 08:22:28.060476
8|26|26|2019-12-15 08:23:47.627301|2019-12-15 08:23:47.627301
9|26|26|2019-12-15 08:42:47.947872|2019-12-15 08:42:47.947872
10|26|26|2019-12-15 08:46:17.911140|2019-12-15 08:46:17.911140

このように、|user_id|post_idがともに同じになってしまいます。

index.htmlの方は、
<%= form_tag("/accepted/#{@current_user.id}/accepted",method: :post,multipart: true) do %>
<input type="number" name="id" required readonly value="<%=post.id%>">
こんな感じで送ろうとしています。

どこがよくないのでしょうか。また、このやり方でないほうがいいのでしょうか。ご教授お願い致します。

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

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

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

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

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

siruku6

2019/12/15 09:43 編集

ソースコードは ```ruby と ``` の間に挟むようにしてください たとえば ```ruby def hoge  print('hoge') end ``` のような感じになります。 そうしないと非常に読みづらく、回答者を困らせてしまうと思います。
tori315

2019/12/15 09:45

ありがとうございます。 次からそのようにします。
退会済みユーザー

退会済みユーザー

2019/12/15 11:36

※解決済みの場合は無視してください > 入力したデータを一覧にしたindexページから、クリックしたらそのデータをもってくるようにしたとき、 コントローラで def acceptednew ~以下略 ↑の質問の意味を確認したいのですが、 newアクションで期待通りのデータを保存できていない(post_idがおかしい)ため、indexページでデータをクリックした時に意図したデータが取れないという事でしょうか?
tori315

2019/12/15 11:52

はい。index.htmiで<%=post.id%>から54という表示のものをクリックして保存しようとすると、なぜかdbのpost_idカラムには2で保存されてしまいます。。 def  acceptednew @post = Post.find_by(id: params[:post_id]) @posted_id = @post.id @accept = Accept.new( user_id:@current_user.id, post_id:@posted_id ) @accept.save redirect_to("/users/#{@current_user.id}") end
退会済みユーザー

退会済みユーザー

2019/12/15 12:12

post_idに期待値が入らないのは、おそらく@post = Post.find_by(id: params[:post_id])が原因だと思います。(そもそも params はどこから飛んできているのかということが疑問なのですが…) index.html全体とコントローラ全体を見せていただけると解決しやすいのでもし可能でしたらお願いします。 <自分が想像しているアプリの流れ> new.html的なページがあり、データを入力する ↓ index.htmlを開くとデータ一覧が表示される ↓ 任意のデータをクリックすると、そのデータの詳細ページに飛ぶ 上記のような流れを想像していたのですが、質問者様が作っているものはindex.htmlページでnewをしているということでしょうか? 制作物全体の流れがよくわからなかったので説明していただけるとアドバイスしやすいです。
tori315

2019/12/15 12:35

はい。あなたのおっしゃる通りのことをしようとしたんですが、やり方がわからず。任意のデータを無理やりinputタグでindexで一覧表記し(内容を変更されては困るのでreadonlyで変えられないようにして)form_tagで移動させ、新しくテーブルに保存して、そこから任意のユーザーがクリックした相手の内容をまとめて表示するページを作ろうと思いました。 このやり方で無い方がよかったでしょうか。。非効率なやり方でしょうか。 index.html.erbはこんな感じです。 <%= form_tag("/accepted/#{@current_user.id}/accepted",method: :post,multipart: true,data:{confirm:"このクエストを受けますか?"}) do %> <% @posts.each do |post| %>    <p>受付No</p>   <input type="number" name="post_id" required readonly value="<%=post.id%>" class="content-waku">
退会済みユーザー

退会済みユーザー

2019/12/15 12:49

なんとなく構造がわかってきました(笑) もう一つ質問なのですが、 index.htmlに対応しているアクションはacceptednewではないですよね…? <% @posts.each do |post| %>の@postsが書いてあるアクション(index.htmlに対応しているアクション)のコードも載せてもらえますか?
tori315

2019/12/15 13:00

説明不足で申し訳ないです。。 class PostsController < ApplicationController before_action:set_post,only: [:show,:edit,:update,:destroy] before_action:authenticate_user,{only:[:index,:show,:edit,:update,:destroy,:questpage]} def kensaku end def index @posts = Post.all.order(created_at: :desc) end def new @post = Post.new end def create @post = Post.new(post_params) @post.user_id = @current_user.id @post.save if params[:img] @post.img = "#{@post.id}.jpg" image = params[:img] File.binwrite("public/post_images/#{@post.id}.jpg",image.read) else @post.img = nil end if @post.save flash[:notice] = "登録に成功しました" redirect_to("/posts/index") else render("/posts/new") end end def post_params params.permit(:title, :category, :money, :jobDate, :radio, :where, :cancel, :img, :postedname, :content,:user_id) end def show @post = Post.find_by(id:params[:id]) end def edit @post = Post.find_by(id:params[:id]) end def update @post.update(post_params) if params[:img] @post.img = "#{@post.id}.jpg" image = params[:img] File.binwrite("public/post_images/#{@post.id}.jpg",image.read) else @post.img = nil end if @post.save flash[:notice] = "編集に成功しました" redirect_to("/posts/index") else render("/posts/edit") end end def destroy @post.destroy flash[:notice] = "削除に成功しました" redirect_to("/users/#{@current_user.id}") end def set_post @post = Post.find_by(id:params[:id]) end end 以上がpostコントローラです。      ↓ routesは Rails.application.routes.draw do get 'posts/index' get "/" => "home#top" get "qa" => "home#qa" get "contact1" => "home#contact1" get "concept" => "home#concept" get "companyAbout" => "home#companyAbout" get "newsAll" => "home#newsAll" get "newsStaff" => "home#newsStaff" get "news" => "home#news" get "posts/index" => "posts#index" get "posts/new" => "posts#new" post "posts/create" => "posts#create" get "posts/questpage" => "posts#questpage" get "posts/kensaku" => "posts#kensaku" get "posts/:id" => "posts#show" get "posts/:id/edit" => "posts#edit" post "posts/:id/update"=> "posts#update" post "posts/:id/destroy" => "posts#destroy" get "login" => "users#login" post "users/login" => "users#loginafter" get "signup" => "users#new" post "users/create" => "users#create" get "users/index" => "users#index" get "users/:id" => "users#show" post "users/:id" => "users#destroy" post "logout" => "users#logout" get "users/:id/edit" => "users#edit" post "users/:id/update" => "users#update" get "users/:id/posted"=> "users#posted" post "accepted/:id/accepted"=>"accept#acceptednew" get "accepted/:id/accepted"=>"users#accepted" end です。よろしくお願いします。
退会済みユーザー

退会済みユーザー

2019/12/15 13:53

長くなったので回答欄の方に書きました
tori315

2019/12/16 02:39

ありがというございます。ほかの方のやり方でやってっみたのですが、post_idは謎の2という数字でdbに保存されてしまいます。 どこから2という数字がくるのかも分かりません。。
退会済みユーザー

退会済みユーザー

2019/12/16 05:25

なかなか解決できず心苦しいのですが、もう一度確認させてください。 (A) [受付No] [post.idが表示されている入力欄(読み取り専用)] [受付No] [post.idが表示されている入力欄(読み取り専用)] [受付No] [post.idが表示されている入力欄(読み取り専用)] ... [受付No] [post.idが表示されている入力欄(読み取り専用)] ←データの数だけある [送信ボタン] (B) [受付No] [post.idが表示されている入力欄(読み取り専用)] [送信ボタン] [受付No] [post.idが表示されている入力欄(読み取り専用)] [送信ボタン] [受付No] [post.idが表示されている入力欄(読み取り専用)] [送信ボタン] ... [受付No] [post.idが表示されている入力欄(読み取り専用)] [送信ボタン]←データの数だけある ①index.htmlのページ構成ですが、AとBのどちらでしょうか(送信ボタンの配置はどんな感じか) ②index.htmlの一覧表示の時点で、表示内容とDB(postテーブル)の内容はあっていますか?
tori315

2019/12/16 06:00

何度もすいません。 (B)の方で作りました。 情報が少ないと伝わりづらいと思ったので、 「rails indexにある任意のデータをクリックしたら、そのデータを持ってきて、任意のユーザーのページでクリックした投稿をまとめて一覧で表示したい」という質問で一応の情報コードを載せて再度上げました。すいません。ぜひお知恵を貸してください。
tori315

2019/12/16 06:04

あと、index.htmlの一覧表示の時点では、表示内容とDB(postテーブル)の内容はあっています。 もってきて、任意のユーザーのクリックした投稿一覧ページでも、間違った2(なぜ2なのかは不明)の投稿は正しく表記されています。 クリックした投稿のpostのid(投稿No.)がacceptテーブルにnewで保存できさえすれば成功なんですが。。
退会済みユーザー

退会済みユーザー

2019/12/16 06:48

お力になれずすみません... 私の方でも引き続き原因を考えてみますが、もし解決しない場合はDB設計の見直しをおすすめします。 (acceptテーブルにuser_idとpost_idを外部キーで結び付け、form_tagをform_forに変更するなど…) テーブルをみたところ、SNSのいいね機能のような動きをしているみたいなので https://qiita.com/nojinoji/items/2c66499848d882c31ffa ↑だったり、「rails いいね機能」とかで検索するとたくさん記事が出てくると思います
guest

回答2

0

id|user_id|post_id|created_at|updated_at

7|26|26|2019-12-15 08:22:28.060476|2019-12-15 08:22:28.060476

ruby

1<%= form_tag("/accepted/#{@current_user.id}/accepted",method: :post,multipart: true) do %> 2<input type="number" name="id" required readonly value="<%=post.id%>"> 3 4[コントローラ] 5@post = Post.find_by(id: params[:id])

まず、user_idとpost_idに同じ数値が入ってしまう理由ですが…
index.htmlのform_tagで、@current_user.idをparams[:id]としてコントローラに送っています。
そのためコントローラ側では、Post.find_by(id: 任意のpost.id)になってほしいところ
Post.find_by(id: current_user.id)として処理されてしまっています。
→結果、user_idとpost_idに同じ数値が入る

で、解決策はやはりwinterboumさんが書いている通りになると思います。(根本的な解決にならずすみません)

@accept = Accept.new( user_id:@current_user.id, post_id:params[:post_id] )

一度postテーブルのデータが期待通りに保存されているか確認してみてください
winterboumさんとのやり取りの「54と表示されているデータを選ぶと2が入る(でも質問者様は58が入ってほしい?)」という挙動がよくわからないので...

投稿2019/12/15 13:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

winterboum

2019/12/16 04:20

ですね。 PostとAcceptとがほしいです。 DBの作りなおしが可能なら、一度綺麗にしてからのほうが混乱がないかも
guest

0

routes.rb がないので間違えるかもですが
<input type="number" name="id" required readonly value="<%=post.id%>">

<input type="number" name="post_id" required readonly value="<%=post.id%>">
とし、
@post = Post.find_by(id: params[:post_id])
にしてみてください。
間違えるかも、があるので念の為 routes.rbもミセテください。

投稿2019/12/15 10:28

winterboum

総合スコア23567

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

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

tori315

2019/12/15 10:48

言われた通りにやってみました。 id|user_id|post_id|created_at|updated_at 22|26|2|2019-12-15 10:39:52.090872|2019-12-15 10:39:52.090872 というように、なぜかpost_idが2という数値になってしまいました。58になら正しいんですが。 routes.rb post "accepted/:id/accepted"=>"accept#acceptednew" def acceptednew @post = Post.find_by(id: params[:post_id]) @posted_id = @post.id @accept = Accept.new( user_id:@current_user.id, post_id:@posted_id ) @accept.save redirect_to("/users/#{@current_user.id}") end
winterboum

2019/12/15 11:13

<input type="number" name="id" required readonly value="<%=post.id%>"> で表示されている数字はいくつでした?
tori315

2019/12/15 11:47

54と表示されています。それをクリックすると、なぜか2で保存されてしまいます。。
winterboum

2019/12/15 11:56

index.html全文見せてください
winterboum

2019/12/15 11:59

今の??問題とはずれますが @post = Post.find_by(id: params[:post_id]) @posted_id = @post.id @accept = Accept.new( user_id:@current_user.id, post_id:@posted_id ) は @post = Post.find_by(id: params[:post_id]) @posted_id = @post.id は不要で @accept = Accept.new( user_id:@current_user.id, post_id:params[:post_id] ) でよいんですがね。
winterboum

2019/12/15 12:01 編集

ん? updateでなくてnewしてsaveですね。 古いデータ見てませんか? 19時の書き込みなのに created_at|updated_at が 2019-12-15 10:39:52 ですよJSTでない?
tori315

2019/12/15 12:26

そうなんです。UTCの時間なんです。。変えられなくて。
winterboum

2019/12/15 21:39

いっそ @accept = Accept.new( user_id:@current_user.id, post_id:params[:post_id] ) にしてみては
tori315

2019/12/16 02:38

すいません。。やってみたのですが、なぜかpost_idは謎の2という数字でdbに保存されてしまいます。 どこから2という数字がくるのかも分かりません。。
winterboum

2019/12/16 03:08

その時のlogを見せてください
tori315

2019/12/16 06:11

何度もすいません。 そのlogというのはどの情報を渡したらよいのかもわからず。。 関係するコードを載せた質問を、「rails indexにある任意のデータをクリックしたら、そのデータを持ってきて、任意のユーザーのページでクリックした投稿をまとめて一覧で表示したい」というタイトルで上げました。 お願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問