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

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

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

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

Q&A

解決済

1回答

460閲覧

中間テーブルのカラムを取り出す方法がわかりません

azumaken

総合スコア14

Ruby on Rails 5

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

0グッド

0クリップ

投稿2021/06/20 13:13

編集2021/06/20 13:47

■ 下記のモデルがあります。

class User < ApplicationRecord 親モデル has_many :intermediates has_many :care_users, through: :intermediates 子モデル class CareUser < ApplicationRecord has_many :intermediates has_many :users, through: :intermediate 中間テーブル class Intermediate < ApplicationRecord belongs_to :user belongs_to :care_user validates :user_id, presence: true validates :care_user_id, presence: true validates :confirmation, presence: true

■ 子モデルのindex.erbにて、hidden_field_tagを使用し、中間テーブルに
user_id,care_user_id,confiramtionカラムに値を飛ばします

<% @care_users.each do |care_user| %> <tr> <td> <% if care_user.image? %> <img src='<%= care_user.image %>' class="index_icon" alt="ユーザーアイコン"> <% else %> <%= image_tag src='picture-3651039_1920.png', class: "index_icon", alt: "ユーザーアイコン" %> <% end %> </td> <td><%= link_to care_user.name, care_user %></td> <td><%= care_user.department %></td> <td> <%= form_with(model: Intermediate, url: user_intermediates_path(current_user), local: true) do |form| %> <%= hidden_field_tag :user_id, current_user.id %> <%= hidden_field_tag :care_user_id, care_user.id%> <%= hidden_field_tag :confirmation, true %> <%= form.submit "確認", class: "btn btn-primary " %> <% end %> </td>

上記の状態でフォームを送信すると、中間テーブルは下記の通りになります

id: 1, user_id: 1, care_user_id: 1, confirmation: true, created_at: Sun, 20 Jun 2021 09:57:32 JST +09:00, updated_at: Sun, 20 Jun 2021 09:57:32 JST +09:00>,

■ これを踏まえた上で、条件分岐で**「current_userが押したcare_user_idのconfirmationカラムがtrueの場合は、確認ボタンをdisabledにする**」という内容を書きたいのですが、うまくいきません。

■ 私が考察し、下記のerbとコントローラーを書いたのですが、スクショのようなエラーが出てしまいます

erb

1<%= form_with(model: Intermediate, url: user_intermediates_path(current_user), local: true) do |form| %> 2 <%= hidden_field_tag :user_id, current_user.id %> 3 <%= hidden_field_tag :care_user_id, care_user.id%> 4 <%= hidden_field_tag :confirmation, true %> 5 <% if @intermediate.confirmation === false %> 6 <%= form.submit "確認", class: "btn btn-primary " %> 7 <% else %> 8  <%= form.submit "確認", class: "btn btn-disabled " %> 9 <% end % 10<% end %>

rb

1CareUsersController 2def edit_index 3 @care_users = CareUser.page(params[:page]).per(5) 4 @care_user = CareUser.find(params[:id]) 5 @intermediate = Intermediate.where(user_id: current_user, care_user_id: params[:id]) 6 end

rb

1IntermediatesController 2 3def create 4 @intermediate = current_user.intermediates.create(care_user_id: params[:care_user_id],confirmation: true) 5 if @intermediate.save 6 redirect_to care_users_edit_index_user_path(current_user) 7 end 8end

イメージ説明

お忙しい中恐れ入りますが、解決策をご教授いただけないでしょうか。

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

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

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

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

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

gentaro

2021/06/20 13:18

タイトル修正できるんで直したほうがいいんじゃないか。
azumaken

2021/06/20 13:21

申し訳ございません。ご指摘下さりありがとうございます。
guest

回答1

0

ベストアンサー

CareUserのcontrollerのcodeが無いので推測ですが、
edit_indexと同じように @intermediate = Intermediate.where。。。としてませんか? なので Relationにはそんなメソッドなし というエラーになります。
もし、このviewをよびだしているaction が edit_index であるなら
@intermediate = Intermediate.where。。。 ではなく
@intermediate = Intermediate.find_by。。。 にしてください

投稿2021/06/20 13:24

winterboum

総合スコア23347

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

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

azumaken

2021/06/20 13:48

記載不足で、大変お手数おかけしました、記載のコントローラーはCareUsersControllerです フォームを飛ばすアクションは追記させていただきます。(IntermediatesControllerです)
winterboum

2021/06/20 22:46

[このviewをよびだしているaction が edit_index であるなら] ⇐ これはあってますか? 合っていた場合は、 「edit_index を呼び出すview」をみたいのであって、「『edit_index を呼び出すview』を描くアクション」ではないです。 edit_index を呼び出す ときのparameterを知りたいので、logでもよいです。
azumaken

2021/06/21 06:23

[このviewをよびだしているaction が edit_index であるなら]⇦合っています 「edit_index を呼び出すview」→ こちらはedit_indexに遷移するviewとの認識でよろしいでしょうか。 上記であれば、user/show.html.erbとなります。 edit_indexに遷移するボタンを押した際のlogを下記に記載いたします。 Started GET "/users/1/care_users/edit_index" for ::1 at 2021-06-21 15:19:55 +0900 Processing by CareUsersController#edit_index as HTML Parameters: {"id"=>"1"} CareUser Load (0.3ms) SELECT "care_users".* FROM "care_users" WHERE "care_users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] Rendering care_users/edit_index.html.erb within layouts/application CareUser Load (0.2ms) SELECT "care_users".* FROM "care_users" LIMIT ? OFFSET ? [["LIMIT", 5], ["OFFSET", 0]] (0.2ms) SELECT COUNT(*) FROM "care_users" Rendered care_users/edit_index.html.erb within layouts/application (123.2ms) Rendered layouts/_shim.html.erb (0.3ms) Rendered layouts/_header.html.erb (0.8ms) Completed 200 OK in 210ms (Views: 166.7ms | ActiveRecord: 0.8ms) 宜しくお願い致します
winterboum

2021/06/21 06:53

で、 @intermediate = Intermediate.find_by。。。 にしてください はやってみました?
azumaken

2021/06/21 07:03

@intermediate = Intermediate.find_by(user_id: current_user, care_user_id: params[:id]) に修正したのですが、エラーとなってしまいます Started GET "/users/2/care_users/edit_index" for ::1 at 2021-06-21 16:00:43 +0900 Processing by CareUsersController#edit_index as HTML Parameters: {"id"=>"2"} CareUser Load (0.2ms) SELECT "care_users".* FROM "care_users" WHERE "care_users"."id" = ? LIMIT ? [["id", 2], ["LIMIT", 1]] User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 2], ["LIMIT", 1]] Intermediate Load (0.2ms) SELECT "intermediates".* FROM "intermediates" WHERE "intermediates"."user_id" = ? AND "intermediates"."care_user_id" = ? LIMIT ? [["user_id", 2], ["care_user_id", 2], ["LIMIT", 1]] Rendering care_users/edit_index.html.erb within layouts/application CareUser Load (0.2ms) SELECT "care_users".* FROM "care_users" LIMIT ? OFFSET ? [["LIMIT", 5], ["OFFSET", 0]] Rendered care_users/edit_index.html.erb within layouts/application (8.6ms) Completed 500 Internal Server Error in 15ms (ActiveRecord: 0.6ms) ActionView::Template::Error (undefined method `confirmation' for nil:NilClass):
winterboum

2021/06/21 07:34

@intermediate = Intermediate.find_by(user_id: current_user, care_user_id: params[:id]) ですね? current_user, care_userともに id 2 で呼ばれていて、該当するデータがないという結果です。 showのviewは載ってます? それとshowアクションとをみたいです
azumaken

2021/06/21 08:07

showのviewとアクションを記載させて戴きます ■view <div> <table class="table table-bordered table-condensed user-table"> <tr> <th><%= User.human_attribute_name(:name) %></th> <td><%= @user.name %></td> </tr> <tr> <th><%= User.human_attribute_name(:department) %></th> <td><%= CareUser.human_attribute_name(:department) %></td> </tr> <tr> <th><%= CareUser.human_attribute_name(:cuser_confirm) %></th> <td> <% =begin%> 全ケアユーザーとcurrent_userに紐づくケアユーザーの数が一致⇨全利用者確認ずみ。 全ケアユーザー - current_userに紐づくケアユーザーか未確認の利用者数。 <% =end%> <% if @care_users.size == @count %> <%="全利用者確認済み"%> <% else %> <div class="red"><%="未確認の利用者が#{@care_users.size - @count}名います"%></div> <% end %> </td> </tr> </table> <%= link_to "利用者一覧", care_users_edit_index_user_path(@user), class: "btn btn-md btn-primary" %> <% if current_user.admin?%> <%= link_to "新利用者作成", new_care_user_path, class: "btn btn-md btn-primary" %> <% end %> </div> ■ アクション def show @user = User.find(params[:id]) @care_users = CareUser.all @count = current_user.care_users.size end 長いこと考察して下さり、ありがとうございます
winterboum

2021/06/21 08:37

@user と CareUser と current_user がでてきますが、current_user はUser所属ですね? current_user と @user の関係は?? そのあたりが混乱してませんか
azumaken

2021/06/21 08:47

ありがとうございます。 上記のshowはuser/show.html.erbなのですが、 おっしゃられる通り混乱しています。。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問