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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

863閲覧

特定のclassのidを取得したい

suguru0717

総合スコア24

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/10/22 15:21

編集2018/10/22 15:22

お疲れ様です。
度々初歩的な質問ですが教えていただきたいことがあります。

状況

簡単な説明ですがさせていただきます。

クラス
content → message
1  対  N の関係を作成してます。
現状だとmessage/1..Nといったようにパラメーターごとのメッセージボックスに入れる状態で、そのページ内にcreate_formを作成してます。

希望としてはcontentに紐づいたメッセージを作成したいのですが、content_idを取得できていない状態です。
もしお分かりになるようであればアドバイスをいただきたいと思います。
よろしくお願いいたします。

controller

def show
@content = Content.find(params[:id])
@message = Message.new
@messages = Message.where(content_id: @content.id)
end

.find_by(id: @content.id)
select ... where id = @content.id

def create
@content = Content.where(content_id: @content.id)
@message = @content.messages.build(message_params)
if @message.save
redirect_back(fallback_location: @content)
else
render "/contents/show"
end
end

**showアクションの中にcreateアクションがある

**Content.find(params[:id])
nilclassとなる
**Content.find_by(params[:id])
content_id 1しか取得できない

view

<%= form_for(@message) do |f| %>
<%= f.label :喋ってみよう %>
<%= f.text_area :talk, class: 'form-control'%>
<%= f.submit "送信", class: "btn btn-success btn-sm" %>
<% end %>

routes

post "/created", to:"messages#create"

上記がコードとなります。

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

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

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

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

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

guest

回答2

0

ベストアンサー

showアクションの中にcreateアクションがある

すみません、意味不明です。
contents#showアクションで表示されるviewにmessage作成フォームがあるということでしょうか?

ruby

1# routes.rb 2resources :contents do 3 resources :messages 4end 5# post '/contents/:content_id/messages', to: 'messages#create' 6 7# messages_controller.rb 8def create 9 @content = Content.find(params[:content_id]) 10 @message = @content.messages.build 11 return render "/contents/show" unless @message.save 12 redirect_back(fallback_location: root_path) 13end

みたいな形であれば問題なく作成できると思いますよ。

投稿2018/10/23 05:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

suguru0717

2018/10/23 10:22

ご回答頂き、誠にありがとうございます。 おっしゃる通りshowview(アクション)の中にcreateview(アクション)がある状態です。 わかりにくくて申し訳ありません。 下記が実際のviewです。 <%= form_for(@message) do |f| %> <%= f.label :喋ってみよう %> <%= f.text_area :talk, class: 'form-control'%> <%= f.submit "送信", class: "btn btn-success btn-sm" %> <% end %> <% @messages.each do |msg| %> <div class="messages"> <div class="talk"> </br> <%= msg.talk %> </div> </br> <div class="time"> <%= msg.created_at %> </div> </br> </div> <% end %> @content = Content.find(params[:content_id]) @content = Content.find(params[:id]) 教えて頂いた通り記述をしてみましたが、上記のクエリだとCouldn't find Content without an IDになります。 showアクションではcontent/1...Nなどのパラメータの取得はできていますがcreateアクションのみcontentのパラメーターの取得ができません。
退会済みユーザー

退会済みユーザー

2018/10/23 11:14 編集

> routes > post "/created", to:"messages#create" 回答にroutesのサンプルも書いたつもりでしたが、もしこのままなのであれば このURLに対してPOSTリクエストを送ってもparams[:id]もparams[:content_id]も取得できないです。 なので@content = Content.find(params[:content_id])って書いてもエラーが出るのは当然です。
suguru0717

2018/10/28 08:47

教えて頂いた通り記述でしたらできました。 ありがとうございます。
guest

0

@messages = Message.where(content_id: @content.id)

@message = count.messages
で良いのでは?
(content のモデル定義で has_many :messages を設定してますよね?)

投稿2018/10/22 21:52

katoy

総合スコア22324

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

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

suguru0717

2018/10/23 11:14

ご回答ありがとうございます。 モデル定義は両方のモデル共に記述しています。 contentが1...Nの分だけあり、1のcontentに帰属する1..Nの数のmessageがある仕組みとなっております。 @messages = Message.where(content_id: @content.id)とするとcontentに紐づいているデータを取得できる内容となっております。 わかりづらくてすみません。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問