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

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

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

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

Q&A

解決済

2回答

1525閲覧

rails4 find_byの複数検索

smith

総合スコア73

Ruby on Rails

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

0グッド

0クリップ

投稿2015/01/12 16:32

下記のコードの@user_have_ac_warrantのfind_byの引数が同じ数字を渡しても正常に動作しません

lang

1def user_have_ac_warrant 2 @user = User.find(current_user.id) 3 4 #アクセスしたitem_idを取得 5 @ac_item_take_params_id = take_params.values.pop.to_i#ここが問題? 中身は"1"だったので「.to_i」をつけて1にしたがうまく行かない 6 7 #アクセスitem 権利者 8 @user_have_ac_warrant = Warrant.find_by(item_id: @ac_item_take_params_id, holder_id: @user) 9end

試しに@xxx = 2を追加して
item_id: @xxxとすれば正常に動作しました。

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

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

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

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

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

guest

回答2

0

自己解決

メソッドが2回目に呼ばれたときに@ac_item_take_params_idが機能しない作りのためnilになる

投稿2015/01/14 10:23

smith

総合スコア73

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

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

0

@user_have_ac_warrant = ... の文の前で break させて、
@ac_item_take_params_id の値を確認したり、
Warrant.find_by(...) の実行をいろいろ試してみたり
してみては如何でしょう?

pry での debugg 方法に慣れていないなら、次のページなどを参考にしてみてください。

投稿2015/01/12 23:09

katoy

総合スコア22324

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

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

smith

2015/01/13 01:28

@ac_item_take_params_idの中身が次の処理に行くと0になっていました。 これが起因するものということはわかりましたが、原因はわかりません
smith

2015/01/13 01:41

先ほどの件は、勘違いでした。 @user_have_ac_warrant = Warrant.find_by(item_id: @ac_item_take_params_id, holder_id: @user) @ac_item_take_params_id = 2 @xxx = 2 @user_have_ac_warrant = #<Warrant:0x007fd344ec0440> ------------------------------------------------------------------------------------------- #@xxx = 2の場合 @user_have_ac_warrant = Warrant.find_by(item_id: @xxx, holder_id: @user) @ac_item_take_params_id = 2 @xxx = 2 @user_have_ac_warrant = #<Warrant:0x007fafe8ac4230> 同じ2を渡しているのにWarrant.find_byの結果が異なるのがなぜなのかわかりません
katoy

2015/01/13 04:01

>> @user_have_ac_warrant = #<Warrant:0x007fafe8ac4230> これは @user_have_ac_warrant のアドレスが表示されています。 puts @user_have_ac_warrant のようにして、値を確認してとおもわれます。 puts @user_have_ac_warrant.inspect や p @user_have_ac_warrant.inspect または pry のコマンドプロンプトからなら単純に @user_have_ac_warrant として、値を確認してみてください。 (アドレスではなく、属性値が表示されるはずです) find_by(...) の結果のオブジェクトのアドレスは実行の度に変化してしまいますのでその値を比較してもデバッグにはなりません。 属性値を比較すれば、どちらに find_id の結果も一致するするはずです。(id で検索しているので、同じ行の内容になる)
smith

2015/01/13 04:44

確認したところ属性値は同じ2でした。 下記のようにしたところ正常に動作しましたが、なぜだかわからず不安です。 def create @user = User.find(current_user.id) #アクセスしたitem_idを取得 @ac_item_take_params_id = take_params.values.pop.to_i#ここが問題? #アクセスitem 権利者  @user_have_ac_warrant = Warrant.find_by(item_id: @ac_item_take_params_id, holder_id: @user) @opportunity = user_have_ac_warrant.opportunities.build(opportunity_params) respond_to do |format| if @opportunity.save format.html { redirect_to @opportunity, notice: 'オポチュしました。' } format.json { render :show, status: :created, location: @opportunity } else format.html { render :new } format.json { render json: @opportunity.errors, status: :unprocessable_entity } end end end
smith

2015/01/13 04:57

解決したと思ったらしてませんでした。 ただ属性値は同じ2でした。
smith

2015/01/13 07:48

メソッドの中では確かに2でしたが、def createではnilになっていました。 #対象のワラント def ac_warrant #アクセスしたitem_idを取得 @ac_item_take_params_id = take_params.values.pop.to_i #アイテムのワラントレコードを取得 @ac_warrant = Warrant.find_by(item_id: @ac_item_take_params_id) end
smith

2015/01/13 08:10

def ac_warrantの@ac_warrantnewの値がnewにもcreateにも渡っていませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問