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

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

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

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

Q&A

2回答

2546閲覧

Rails: Find_byでのnilによるエラーを回避&formを1つにまとめたい

sakurasaku

総合スコア15

Ruby on Rails

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

0グッド

0クリップ

投稿2017/09/20 11:50

現状、動作そのものはできております。ただ、タイトル内の問題を解決しつつ、冗長すぎる既存コードを書き換えたいと考えています。既存コードは下記の通りです。

#users_controller

ruby

1@user = User.find_by(id: params[:id]) 2@post1 = Post.find_by(user_id: @user.id, number: 1, rank: 1) 3@post2 = Post.find_by(user_id: @user.id, number: 2, rank: 1) 4@post3 = Post.find_by(user_id: @user.id, number: 3, rank: 1)

#show.html

ruby

1<h4 id="list-item-1"><%= @post1.name %></h4> 2 <%= render 'form1', user: @user %> 3<h4 id="list-item-2"><%= @post2.name %></h4> 4 <%= render 'form2', user: @user %> 5<h4 id="list-item-3"><%= @post3.name %></h4> 6 <%= render 'form3', user: @user %>

#_form1.html.erb(同様に_form2と_form3が存在、違いはコード内の下記一文の数字部分だけ)

ruby

1..... 2<% if post.number == 1 %> 3.....

#解決したい方向性(numberが10まで増えても対応可能なように)

1: users_controller内の繰り返し処理をうまくやりたい(現状だと、仮にnumber:3該当分がnilだとエラーになってしまう)
2: _form#.html.erbのファイル数が増えないよう、一つのファイル内におさめたい

繰り返し処理に関する、初歩的な質問になっていると思いますが、ご教示いただけますと幸いです。どうぞよろしくお願いいたします。

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

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

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

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

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

gouf

2017/09/20 20:41

たとえば次のコードは動作しますか? : Post.where(user_id: @user.id, number: [1, 2, 3], rank: 1)
sakurasaku

2017/09/20 23:13

コメントありがとうございます。 今回の処理でwhereメソッドを試した時、undefined method `name' for #<Post::ActiveRecord_Relation:乱数>などのエラーがいつも表示されるため、既存コードでもfind_byを使っておりました。ご教示いただいたコードでも改めてトライしてみましたが、同じようなエラーとなってしまいました。 なお、whereメソッドは他の処理部分で用いたりしておりますが、うまくいく時と、色々試行錯誤しても同様のエラーが改善せずに使うのを諦めたことがございます。
guest

回答2

0

formの中身がごく一部しか示されておらず、いまいちやりたいことがよくわからないのですが、

app/models/users.rb で

rb

1class User 2 has_many :posts 3end

app/controllers/users_controller.rb

rb

1@user = User.find(params[:id]) 2@posts = @user.posts.where(rank: 1).order(:number)

app/users/show.html.erb

erb

1<% @posts.each do |post| %> 2<h4 id="list-item-#{post.number}"><%= post.name %></h4> 3 <%= render "form#{post.number}", user: @user %> 4<% end %>

としても問題無さそうに見えますね。

後は憶測ですが、
f.fields_for
を使ったほうが良い場面なのかもしれません。

投稿2018/09/28 10:15

takumiabe

総合スコア661

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

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

0

あなたがやりたいことは、あるユーザーの投稿一覧を取得して表示、のようなことではないですか?

#UserController

Ruby

1# パラメータからユーザーidを取得し、該当ユーザーの rank: 1の投稿を全件取得 2@post = Post.where(user_id: params[:id], rank: 1)

#show.html

Ruby

1<% @post.each do |post| %> 2 <h4 id="list-item-3"><%= post.name %></h4> 3 <%= render 'form3', user: post %> 4<% end %> 5

投稿2017/09/21 03:43

mtdsnsk

総合スコア789

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問