tacky4
@tacky4 (Tacky4 .)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

複雑な式をまとめて繰り返しにしたい。

解決したいこと

画像の存在の判定→画像の保存、という処理を繰り返し処理に直したい。

例)
Ruby on Railsで写真投稿のアプリをつくっています。
nameタグで送信された画像(name名:case_image(N))を保存したいのですが、
投稿クラス(Postクラス)のカラム名に変数が入っているため(カラム名:case_image(N)_name)、
今の自分の知識では繰り返し処理に直すことができません。
どなたかご存じの方がいれば解決策をおしえていただけないでしょうか?

繰り返し処理に直したい部分

post_controller.rb
if params[:case_image1]
  @post.case_image1_name="#{@post.id}_case_image1"
  case_image1=params[:case_mage1]
  File.binwrite("public/case_images/#{@post.case_image1_name}",case_image1.read)
end

if params[:case_image2]
  @post.case_image2_name="#{@post.id}_case_image2"
  case_image2=params[:case_image2]
  File.binwrite("public/case_images/#{@post.case_image2_name}",case_image2.read)
end

if params[:case_image3]
  @post.case_image3_name="#{@post.id}_case_image3"
  case_image3=params[:case_image3]
  File.binwrite("public/case_images/#{@post.case_image3_name}",case_image3.read)
end

if params[:case_image4]
  @post.case_image4_name="#{@post.id}_case_image4"
  case_image4=params[:case_image4]
  File.binwrite("public/case_images/#{@post.case_image4_name}",case_image4.read)
end

以下繰り返し処理
0

2Answer

1からNまで処理を繰り返すのは (1..N).each do |i| 処理 end と書くことができます。変数の値をシンボルに含めるには :"xxx_#{i}" と書けます。またメソッド名を与えてメソッドを呼び出すには xxx.public_send(:yyy) と書けます。

組み合わせると繰り返し処理は以下のように書き直せます。

N.times do |i|
  if (case_image = params[:"case_image#{i}"])
    name = @post.public_send(:"case_image#{i}_name") = "#{@post.id}_case_image#{i}"
    File.binwrite("public/case_images/#{name}", case_image.read)
  end
end

しかし、そもそも1つの post が多数の画像を持つ設計なら、画像カラムを複数作るのではなく has-many でモデルを関連付けるべきだと思います。参考: https://railsguides.jp/association_basics.html#has-many関連付け

0Like

ありがとうございます! 
has_manyで無事保存することができました!

0Like

Your answer might help someone💌