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

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

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

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

Ruby

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

Q&A

解決済

1回答

1427閲覧

idが同じものしか取得できない。rails

Haru_510

総合スコア14

Ruby on Rails 5

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

Ruby

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

1グッド

1クリップ

投稿2018/09/18 09:09

現在音楽サイトみたいなものを作りたいと考えていて、sound_post, micropost, userモデルができています。
soundpostは音楽でmicropostはコメントのような感じです。
モデル間の関連付けなどは終わらせています。

私はindexページで曲をそれぞれ表示し、その曲にコメントするボックスと、コメントを投稿するボタンを作りたいと考えていています。
お気に入りの機能と似てるなと勝手に判断し、それを参考にajaxでボタンで投稿画面を開ける!みたいなものを作ってみたかったのですが、手に負えず一旦断念し、今はボタンを作って下にそのままコメントできるようにしています。

悩んでいる点

sound_postのidを取得してuser_idも持ったmicropostを作りたいのですが、下のようにやると同じsound_post_idしか取得できません。また、そのidをずっと引き継いで投稿してしまいます。(idがいらない場合でも)

自分的にはform_forでうまくできてないのかなと思いつつも直し方もわからず詰んでます...
@micropost = @sound_post.microposts.build...の部分も@sound_postが固定されていることで@sound_postに基づいたものしか作れないのかな、などと考えても見ましたが今の所理解不能です。

最終的にはsound_post情報がいらない場合は何も取らずmicropostを作り、sound_postに基づいたmicropostを作るときはidを取ってこれるように2つの状態を作りたいです。

なかなか調べても自分と似たような記事が見つかりません!一緒に考えていただけると光栄です、よろしくお願いします!


sound_posts/index.html.erb <% @sound_posts.each do |sound_post| %> <tr> <td><%= sound_post.title %></td> <td><%= sound_post.content %></td> <td><%= audio_tag sound_post.sound, :controls => true %> </td> <%= render 'sound_posts/sound_post', sound_post: sound_post %> <% if current_user %> <td style='text-align:right;'> <%= link_to 'Edit', edit_sound_post_path(sound_post), class: 'btn btn-default btn-xs' %> <%= link_to 'Destroy', sound_post, method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-xs btn-danger' %> </td> <% end %> </tr> <% end %>
_sound_post.html.erb <td class="sbutton"> <%= form_for(sound_post.microposts.build, remote: true) do |f| %> <div><%= hidden_field_tag :sound_post_id, sound_post.id %></div> <%= button_tag(class: "btn btn-default btn-xs") do %> <%= content_tag :span, "post" %> <% end %> <%= f.text_area :content, placeholder: "Compose new post..." %> <% end %> </td>
microposts_controller.rb def create @sound_post = SoundPost.find_by(params[:id]) @micropost = @sound_post.microposts.build(micropost_params) @micropost.user_id = current_user.id if @micropost.save flash[:success] = "投稿しました" redirect_to root_url else @feed_items = [] render 'static_pages/home' end end def micropost_params params.require(:micropost).permit(:content, :sound_post_id) end
Yuki__Watanabe👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

_sound_post.html.erbを見る限り、実際のpost処理はJavaScriptで行っているようですね。そのJavaScriptの実装がうまくできていないように見えます。

まずは、button_tagとなっている箇所を <%= f.submit('post') %> にしてみて、同期的にコメントを残すところからやってみて、問題を分割するとよいと思います。

それがうまくいったあとに、また非同期に戻して、JavaScriptの中でpostする前に sound_post_id を引いている箇所がうまくうごいているか確認してみるのをおすすめします。

投稿2018/09/18 12:04

kenchankunsan

総合スコア240

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

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

Haru_510

2018/09/18 17:59

変えて見ましたがやはり同じidしか取ってこれないですね。。。 一つわかったことはSoundPostを新しく作ることで取ってくるidが新しいものに変わるようになっていて、古いsoundpostの中でmicropostしても新しいやつでのmicropostになっていました。
Haru_510

2018/09/19 22:29

自己解決いたしました!
kenchankunsan

2018/09/20 11:42

お返事が遅れてすみません!ちょっと違ったようですが、なにかヒントになったようなら幸いです!
Haru_510

2018/09/21 06:16

はい! フォームでは送れていたのですが find_byするところでcreated_atを引っ張っていたみたいでそれで常に新しいものになっていました。 find(id: params{:sound_post_id])とすることでちゃんとidを取ってきてくれました!! ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問