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

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

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

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

Q&A

1回答

1126閲覧

[Rails]詳細ページでのform_for

re_refuse

総合スコア17

Ruby on Rails 5

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

0グッド

0クリップ

投稿2019/08/26 02:07

編集2019/08/26 05:15

前提・実現したいこと

現在SNSサイトを作っているのですが、formをパーシャルにしています。
article/1というurlの状態でformをcreateアクションに飛ばしたいのですが、editアクションに飛んでしまいます。
(article/1にrailsに用意されているform各種を置いた時点で、formのそれぞれのinputボックスにはarticle/1のtitleとbodyの情報が入力されている状態です。)
どうすればよろしいでしょうか?

該当のソースコード

view

1 <%= form_tag('/articles') do %> 2 <%= label :article,:title %><br> 3 <%= text_field :article,:title%> 4 </div> 5 <div class="form-group"> 6 <%= label :article,:body %><br> 7 <%= text_area :article,:body%> 8 </div> 9 <div class="form-group"> 10 <%= submit_tag "Create",class:"btn btn-primary"%> 11 </div> 12<%end%>

controller

1 def create 2 @article=Article.new(article_params) 3 @article.user_id=current_user.id 4 if @article.save 5 flash[:success]="successfully" 6 redirect_to article_path(@article) 7 else 8 flash[:error]="error" 9 redirect_to articles_path 10 end 11 end 12 13 def edit 14 @article=Article.find(params[:id]) 15 if @article.user_id == current_user.id 16 @article.save 17 else 18 redirect_to articles_path 19 end 20 end 21 22 def update 23 article=Article.find(params[:id]) 24 if article.update(article_params) 25 flash[:success]="successfully" 26 redirect_to article_path(article) 27 else 28 flash[:error]="error" 29 redirect_to article_path(article) 30 end

routes

1articles GET /articles(.:format) articles#index 2 POST /articles(.:format) articles#create 3 new_article GET /articles/new(.:format) articles#new 4 edit_article GET /articles/:id/edit(.:format) articles#edit 5 article GET /articles/:id(.:format) articles#show 6 PATCH /articles/:id(.:format) articles#update 7 PUT /articles/:id(.:format) articles#update 8 DELETE /articles/:id(.:format) articles#destroy

試したこと

form_forの仕様で、URLを元にアクションを判断していることを知ったので、urlでコントローラーとアクションを指定したり、form_with,form_tagを使ってみたのですが全てeditアクションになってしまいます。

追記
Railsの使用に関する質問だったので、ソースはいらないと判断してしまいました。
質問内容は、form_forやform_with,form_tagの挙動として、article/1のページででarticleを生成するformを作るとcreateではなくeditになってしまうのはどうすれば良いか、ということです。よろしくお願いします。

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

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

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

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

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

Mugheart

2019/08/26 03:46

せめて最低限テンプレートにある項目(該当のソースコードや試したことなど)くらいは具体的にわかりやすく提示してください。 文章だけでは何をしたのか、やり方は本当にあっているのかなどわかりづらく、回答もつきにくいかと思います。
Mugheart

2019/08/26 04:01

articles_pathが何を指すのか知りたいのでroutes.rbの追記もお願いします。
re_refuse

2019/08/26 04:02

resourcesになっています。
Mugheart

2019/08/26 04:04

提示されているform部分はパーシャルになっており、 show.html.erb内にrenderされているという認識でいいでしょうか? 提示されているformはform_forではなくform_tagとなっていますが間違いないでしょうか?
re_refuse

2019/08/26 04:09

form_for :url => {:controller => :articles, :action => :create}) :url: books_path ですでに試しております。 railsに用意されたformそれぞれの挙動がいまいちわからないので、form_tagならurlを元に判定をしないのではないか、ということで試したのが現状です。 よろしくお願いします。
guest

回答1

0

色々よくない点や不明な箇所がありクリティカルな原因を特定できないので、「これを直せばOK」とは言えない状況です。(例えば edit でなぜか save しようとしてるところとか...)

form_for の動きについてざっくりと説明すると...
form_forの第一引数はモデルのインスタンスである必要があります。
form_for は引数のモデルインスタンスが新規レコード(record.new_record? == true)の場合createアクションへ、既存レコード(record.persisted? == true)の場合updateアクションへ送信されます。

formを送信するとeditアクションに飛ぶというのは全くわかりません。
というのもformはデフォルトでPOSTリクエストが送信されるのでGETリクエストで実行されるeditアクションは実行されません。

おそらくですがeditアクションとupdateアクションを勘違いされているのでは?
基礎的な使い方がわかっていないのではないかなと思うので、Railsのチュートリアルに取り組むことを個人的にはお勧めしますが、問題を細分化できるのであれば回答しますので修正をお願いします。

投稿2019/08/26 04:33

Mugheart

総合スコア2342

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

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

re_refuse

2019/08/26 05:02 編集

まだ初心者なのでcreateとnewの違い、edit、updateの違いがviewが存在するかしないかくらいしか理解しておりません。 それは置いとけないですが、置いておいて、form_forの時の書き方が下になります。 <%= form_for(@aritcle, :url => {:controller => :articles, :action => :create}) do |f| %> <div class="form-group"> <%= f.label :title %><br> <%= f.text_field :title%> </div> <div class="form-group"> <%= f.label :body %><br> <%= f.text_area :body%> </div> <div class="form-group"> <%= f.submit "Create",class:"btn btn-primary"%> </div> <%end%> articleのeditパスでも編集ができるのですが、showのページにformを置くとupdtae(?)になってしまいます。なので上記の比較演算でarticle/1というurlを参考にした時、article/1は存在するのでupdate用form になっているということかもしれないと考えました。 この比較演算をarticleのshowページ内では常にcreateということはできないでしょうか?。
Mugheart

2019/08/26 05:02

書き方自体は問題なくへarticles_pathへPOSTリクエストが送信されるようなフォームになっています。 一度createアクション内にデバッガーを仕込んで実行されているかどうか確認してみてください。
re_refuse

2019/08/26 05:18 編集

binding.pryを記述するる前に 以前にも行なっていたはずなのですが、エラーが出ました。 Routing Error No route matches [PATCH] "/articles" と表示されています。resourcesのアクションは制限していません。
Mugheart

2019/08/26 05:17

コード上に"/books" が一度も出現していないので原因はこちらではわかりません。
re_refuse

2019/08/26 05:19

すいません。修正しました。 form_forのurlの記述でアクションを指定しているにも関わらず、updateに飛ばされてそうです。
Mugheart

2019/08/26 05:27

エラーが出るということですか? 処理自体は正常に行われているけど実行されているのがupdateアクションということですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問