0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ruby, railsでハマった罠集(随時更新)

Last updated at Posted at 2021-06-03

2次元配列の初期化

###ダメな書き方

dp = Array.new(N+1, Array.new(M+1, 0))

dp[1][0] を更新すると dp[0][0]も更新されちゃうやつ(object_idが一緒)

###正しい書き方

dp = Array.new(N+1) {Array.new(M+1, 0)}

###参考

全角スペース

###まずみてください

test.rb
if false
    puts 'A'
else 
    puts 'C'
end

何も出力されません. エラーも出ません.
実は, elseの後に全角スペースが入ってます.

エラー出してくれ・・・

file_field_tagでファイル名しか送れない

ダメな書き方

app/views/コントローラ名/ほにゃ.html.erb
<%= form_tag(controller: コントローラ名, action:"ほにゃ", multipart: true) do%>
    <%= file_field_tag("file")%>
    <%= submit_tag%>
<% end %>
app/controller/コントローラ名_controller.rb
.
.
.

  p params[:file].class

.
.
.

これだとstring型だと言われ, 内容はfile名です.
URLをよく見ると, 最後に?multipart=trueみたいになってたので
あぁここの書き方がよくなさそうみたいな見当はつきました

ただしい書き方

<%= form_tag({controller: コントローラ名, action:"ほにゃ"}, multipart: true) do%>
<%= file_field_tag("file")%>
<%= submit_tag%>
<% end %>

結局どうしてだめだったのかあんまりわかってない

ドキュメント
form_tag(リンク先 [オプション or HTML属性 or イベント属性]) do
end

らしいので, リンク先というのが一つのハッシュになってないといけないのかなぁ
って思ったけど

<%= form_tag(controller:hoge, action:fuga)%>

でも許されるんだよなぁ

ってきもちでわからない。

参考

配列の複製1

これは, 書く前にどうせそうだろうなぁ〜って思って調べたのでハマってはないけど。

ダメな書き方(=で代入)

A = [1,2,3]
B = A
B[0] = 0

p A
p B
p (A.object_id == B.object_id)
実行結果
[0, 2, 3]
[0, 2, 3]
true

Aの中身も変わっちゃってます。
object_idも同じなので, そういうことです。

正しい書き方(clone, dup)

A = [1,2,3]
B = A.dup
B[0] = 0

p A
p B
p (A.object_id == B.object_id)

C = [1,2,3]
D = C.clone
D[0] = 0

p C
p D
p (C.object_id == D.object_id)
[1, 2, 3]
[0, 2, 3]
false
[1, 2, 3]
[0, 2, 3]
false

dup はオブジェクトの内容, taint 情報をコピーし、 clone はそれに加えて freeze, 特異メソッドなどの情報も含めた完全な複製を作成します。

###参考

配列複製2(浅いコピーと深いコピー)

上の続き。

###だめな書き方

A = [[1,1],[2,2],[3,3]]
B = A.dup

B[1] = [3,3] #これはいいけど
B[0][0] = 0 #これはだめ
p A
p B
p A.object_id == B.object_id
実行結果
[[0, 1], [2, 2], [3, 3]]
[[0, 1], [3, 3], [3, 3]]
false

object_idは違うけど, 浅いコピーになってる。

clone や dup は浅い(shallow)コピーであることに注意してください。

###ただしい書き方

A = [[1,1],[2,2],[3,3]]
B = Marshal.load(Marshal.dump(A))

B[0][0] = 0 
p A
p B
p A.object_id == B.object_id
実行結果
[[1, 1], [2, 2], [3, 3]]
[[0, 1], [2, 2], [3, 3]]
false

###参考

#モデル名
###だめなこと
モデルの名前をrecordにする

railsで使ってるものと名前が被ってしまうらしくて, Record.newとかできなくなる.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?