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

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

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

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

Q&A

解決済

1回答

1110閲覧

RoRチュートリアル7章の演習 URLが送信後に変わる理由

pecchan

総合スコア592

Ruby on Rails 5

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

0グッド

0クリップ

投稿2020/05/20 02:39

編集2020/05/20 03:29

Ruby on Railsチュートリアルを勉強してます。

7章の演習において「考えましょう」のまま答えがないものがあり悩んでます。

未送信のユーザー登録フォーム (図 7.12) のURLと、送信済みのユーザー登録フォーム (図 7.18) のURLを比べてみましょう。なぜURLは違っているのでしょうか? 考えてみてください。

要は、ユーザー登録フォームのURLが、送信前と送信後で変わるのですが、
その明確な理由が分かりません。

送信の流れを整理してみましたが、やはり最後のURLが何故/usersになるのか分かりません・・・

ルーティングに従い、usersコントローラーのcreateアクションへ。

@user.saveで失敗するのでrender 'new'が実行される。

でもURLは何故/users??
post と 'users#new'の組み合わせが無いから?

ルーティング

ruby

1Rails.application.routes.draw 2 get '/signup', to: 'users#new' 3 post '/signup', to: 'users#create' 4 resources :users 5end

コントローラ

ruby

1class UsersController < LoginController 2 def new 3 @user = User.new 4 end 5 6 def create 7 @user = User.new(user_params) 8 if @user.save 9 @user.send_activation_email 10 flash[:success] = "メールを確認して、アカウントを有効にしてください。" 11 redirect_to root_url 12 else 13 render 'new' 14 end 15 end 16 17 def edit 18 @user = User.find(params[:id]) 19 end 20 21 def update 22 @user = User.find(params[:id]) 23 if @user.update_attributes(user_params) 24 flash[:success] = "更新しました" 25 redirect_to @user 26 else 27 render 'edit' 28 end 29 end 30 31 def index 32 @users = User.paginate(page: params[:page]) 33 end 34 35 private 36 37 def user_params 38 params.require(:user).permit(:name, :email, :password, :password_confirmation) 39 end 40 41 42end 43

ビュー

ruby

1 2 <%= form_for(@user) do |f| %> 3 <%= render 'shared/error_messages' %> 4 <%= f.label :name %> 5 <%= f.text_field :name, class: 'form-control' %> 6 7 <%= f.label :email %> 8 <%= f.email_field :email, class: 'form-control' %> 9 10 <%= f.label :password %> 11 <%= f.password_field :password, class: 'form-control' %> 12 13 <%= f.label :password_confirmation %> 14 <%= f.password_field :password_confirmation, class: 'form-control' %> 15 16 <%= f.submit yield(:button_text), class: "btn btn-primary", id: "commit" %> 17 <% end %> 18 19

送信前のURL
app/users/signup
イメージ説明

送信後のURL
app/users
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

1.POSTリクエストで/signupを要求

そもそも、この前提が間違っていませんか?POST前のフォームでそれを確認してみましょう。

投稿2020/05/20 02:51

maisumakun

総合スコア146018

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

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

pecchan

2020/05/20 02:59

私の書き方が悪かったようです。 登録フォームの初期表示と、登録実行後という意味合いでした。 書き直します。
maisumakun

2020/05/20 03:12

単に「/signup」ではなく「/users」にPOSTしているだけ、ということはありませんか?(resourcesがあるので、/usersへのPOSTもusers#createを実行します)
pecchan

2020/05/20 03:33

ビューをアップしました。 >単に「/signup」ではなく「/users」にPOSTしているだけ、ということはありませんか <%= form_for(@user) do |f| %> がそのことでよろしかったでしょうか? <%= form_for(@user, url: signup_path) do |f| %> とすればURLも統一されるのは分かりました。 これが知りたい動作でした↓ >(resourcesがあるので、/usersへのPOSTもusers#createを実行します) なるほど、railsがよしなに判断して、の流れだったんですね?
maisumakun

2020/05/20 03:34

> <%= form_for(@user) do |f| %> はい、特にURLを指定しなければ、Userモデルからuser_pathへの送信を自動で設定します。
pecchan

2020/05/20 03:38

有難う御座います! おかげでスッキリしました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問