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

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

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

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

Q&A

解決済

1回答

500閲覧

【Ruby on Rails 5】登録と更新を1画面(editとupdateだけ)で行いたい

pecchan

総合スコア555

Ruby on Rails

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

0グッド

0クリップ

投稿2017/08/03 08:37

編集2017/08/03 08:41

日付と文章を登録するだけのシンプルな画面を作りたいです。
scaffoldのような感じではなく、1画面で新規追加と更新を行いたいです。
※削除は不要。

【仕様】
日付を入力→入力された日付にデータが無ければ新規追加で登録。
すでにデータがあれば、文章を表示し、更新で登録。
※日付には、初期値として現在日がセットされる。

このようなものを作りたく以下のようにしました。

ruby

1 2モデル 3class Poem < ApplicationRecord 4end 5 6ビュー 7<div class="container-fluid"> 8 <div class="row" style="margin-top:5%; margin-left: 10;"> 9 <div class="text-center"> 10 <div class="input-group" > 11 <%= text_field_tag('date', @date, id: 'poem_date', class: 'date-picker') %> 12 13 <%= form_for(@poem, url: poems_path) do |f| %> 14 <%= f.hidden_field :date %> 15 <%= f.text_area :poem, cols: "60", rows:"20" %> 16 <%= f.submit '登録', class: 'btn btn-primary btn-lg' %> 17 <% end %> 18 </div> 19 </div> 20 </div> 21 22コントローラ 23class PoemsController < ApplicationController 24 25 def create 26 end 27 28 def edit 29 30 @date = params[:date] || Date.today 31 @poem = Poem.where(date: @date).first_or_initialize 32 33 end 34 35 36 def update 37 38 39 if @poems.update(params) 40 redirect_to poems_edit_path(date: params[:date]) 41 else 42 render :edit 43 end 44 end 45 46 47end 48 49ルーティング 50Rails.application.routes.draw do 51 resources :poems, only: [:update, :create] do 52 collection do 53 get :edit 54 end 55 end 56end 57

それで
app/poems/edit
から登録ボタンを押しても何も反応しません。
ログも出力されません。

create()が空だからと思いますが、
これが無いとエラーになりますし、、、
出来ればcreate()を使わずedit()とupdate()だけで実装したいのですが。

どこが間違っているでしょうか?
分かる方、教えて下さい。

宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

PUT送ればupdateされると思います

%= form_for(@poem, url: poems_path, html: { method: :put } do |f| %>

◆追記(ルーティングについて)
ルーティングを現状と変えないなら

resource :poems, only: [:edit, :update] GET /poems/edit →今日のpoem編集 PUT /poems → 今日のpoem更新 GET /poems/edit?date=xxx → xxx日のpoem編集

※以下は個人的な見解です
ただし1日ごとに1つのpoemを作るならパラメータでdateを受け渡すよりも、
日付ごとの各poemにそれぞれURLがある方が良いと思います。

resources :poems, param:date, only: [:edit, :update] GET /poems/xxx/edit → xxx日のpoem編集 PUT /poems/xxx → xxx日のpoem更新

xxxはparams[:date]で受けることが出来ます。

投稿2017/08/03 23:06

編集2017/08/04 05:12
hellomartha

総合スコア329

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

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

chelsy7110

2017/08/04 00:59

コード自体はあっていますが、 >form_forから送られるリクエストはデフォルトPOSTなのでcreateにルーティングされます。 これは誤解を招きかねない表現だと思います。 form_forはオブジェクトが既に存在しているかを確認してcreateまたはupdateに振り分けます。 今回は@poemがfirst_or_initializeで作成された新規のレコードだったのでpostになりcreateに行ったのでしょう。
hellomartha

2017/08/04 01:13

訂正ありがとうございます、仕様を勘違いしておりました。 言われてみればeditフォームでいちいちメソッド指定とかしていなかった
pecchan

2017/08/04 04:00

有難う御座います。 form_forにご指摘のようにputを追加しました。 あとはコントローラから、空のcreate()を削除、あとはそのままの状態で 登録を実行すると、以下のようなエラーになりました。 「No route matches [PUT] "/poems"」 ルーティングの設定でしょうか? コントローラにputが必要なのでしょうか。
hellomartha

2017/08/04 05:12 編集

ルーティングについて回答追記しました。 コメントはマークダウンできない?
pecchan

2017/08/06 01:12

最後までご親切に解説していただき有難う御座いました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問