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

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

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

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

Q&A

解決済

2回答

1032閲覧

rails 複数のviewに新規投稿フォーム render先はそれぞれのview

apo2983

総合スコア5

Ruby on Rails

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

0グッド

0クリップ

投稿2020/04/25 02:49

前提・実現したいこと

railsでちょっとしたブログサイトを作っています。
また、ログイン機能などはdeviseを用いて作っています。
モデルはUser(ユーザー情報)とBook(記事投稿の情報)の2つです。
今回は複数のページに新規投稿画面を搭載しようとしています。
そして投稿が規定の文字数を超えた時などのエラー時にはrender先としてその時のviewファイルを指定するのが目的です。

発生している問題・エラーメッセージ

複数のページに一つのcreateアクションを設定しているのですが、投稿の際のエラー時のrender先をその時のそれぞれのviewファイルに設定する方法が分かりません。
また、createアクション内でrender 'show'(投稿の際にえらーが起きた時)と記載したとします。showファイルでは新規投稿フォームとそのユーザーが投稿した情報の一覧が記載されています。その場合createアクション内に@user = User.find(params[:id])のように記載してユーザーのidを見つけてこないといけないのですがそうするとcreateアクションのurlにはid情報はないのでエラーになります。

該当のソースコード

html

1<div class="col-xs-3"> 2 <section class="users-info"> 3 <h2>User info</h2> 4 <%= attachment_image_tag @user, :profile_image, format:'jpeg',fallback:"no_image.jpg",size:"100x100" %> 5 <table class="table"> 6 <tr> 7 <td><strong>name</strong></td> 8 <td><strong><%= @user.name %></strong></td> 9 </tr> 10 <tr> 11 <td><strong>introduction</strong></td> 12 <td><strong><%= @user.introduction %></strong></td> 13 </tr> 14 </table> 15 <div class="row"> 16 <%= link_to edit_user_path(@user.id) do %> 17 <span class="col-xs-12 edit-icon" href=edit_user_path(@user.id)><i class="fas fa-edit"></i></span> 18 <% end %> 19 </div> 20 </section> 21 <div class="new-book"> 22 <h2>New book</h2> 23 <%= form_for(@book,url: books_path, method: :post) do |f|%> 24 <div class="field row" style="padding-bottom: 10px"> 25 <p class="book-title"><strong>Title</strong></p> 26 <%= f.text_field :title, class:"col-xs-12" %> 27 </div> 28 <div class="field row" style="padding-bottom: 10px"> 29 <p class="book-opinion"><strong>Opinion</strong></p> 30 <%= f.text_area :body, class:"col-xs-12" %> 31 </div> 32 <div class="actions row" style="padding-bottom: 10px"> 33 <%= f.submit "Create Book",class:"col-xs-12 btn btn-primary"%> 34 </div> 35 <% end %> 36 </div> 37 </div>

controller

1class BooksController < ApplicationController 2 def create 3 @user = User.find(params[:id]) 4 @books = @user.books.page(params[:page]).reverse_order 5 @book = Book.new(book_params) 6 if @book.save 7 flash[:notice] = "Book was successfully created." 8 redirect_to book_path(@book.id) 9 else 10 render 'show' 11 end

試したこと

部分テンプレートを用いて新規投稿の部分を一つにまとめようとしていますが、対処としあっているのかいまいち分かっていません。
初心者で分からないことだらけなのでご教授いただけると幸いです。

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

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

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

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

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

guest

回答2

0

@user = User.find(current_user.id)

これでなんなく解決!

投稿2020/06/19 04:00

apo2983

総合スコア5

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

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

0

ベストアンサー

BooksController の new アクションが省略されてしまっているんで想像になります。

crate に user.id がわたらないのは、<form></form>の中に、hidden_fieldでuser_id を書いておけば、paramsに入ります。

params[:id]でuser_idを得るつもりのようですが、BooksControllerなのでそれはやめたほうが良いです。 user_id にしましょう

saveに失敗した時に show を呼んでいますが、普通は new です。そこでエラー表示して、入力し直します。

投稿2020/04/25 10:08

winterboum

総合スコア23567

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

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

apo2983

2020/04/25 10:24

newのアクションとviewを用意しなかったのはusersのshowのviewにユーザーの情報とbooksでの新規投稿フォームを一緒にしようとしているからという感じです。 なので今困っているのは/books/:idのviewで@user = User.find(params[:id])を行うとエラーになることです。 def show @book = Book.new @book = Book.find(params[:id]) @user = User.find(params[:id]) end 一つのアクションに2つのfind(params[:id])はおかしいのでしょうか??
winterboum

2020/04/25 10:33

newの変わりにshowを使っても構いませんが、そのcodeがないと問題の絞り込みが困難です。 いくつ find(params[:id]) があっても構いませんが、その id は何の id が来るのか、を意識してください。 一つの params[:id] がUserのものであったりBooksのものであったり変化することはないので。 viewを呼ぶactionが載せてないのでわからんですが、viewにはidを返す記述が一つも無い様に見えます。 エラーってどんなエラーですか?エラーメッセージも載せないと解決困難です
apo2983

2020/04/26 02:19 編集

失礼しました。 エラーは ActiveRecord::RecordNotFound in BooksController#show Couldn't find User with 'id'=4 です。 ちなみにこの時のurlはhttp://localhost:3000/books/4です。 @user = User.find(params[:id])の部分でidを見つけられないと言っています。この時のuserのidは1で、id=4はbookの方のidなので見つけられないというのは理解はできますがどうすればuserのid=1も見つけてあげられるのでしょうか?
winterboum

2020/04/26 03:14

それはエラーメッセージではなくエラーメッセージの一部です。 エラーメッセージを
winterboum

2020/04/26 03:15

ですから最初に回答に書いてあるでしょう
apo2983

2020/04/26 13:07 編集

ですから〜見せつける俺なりのはいから〜ほなさいなら〜 ちなみに自己解決しました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問