ルーティングの追加
下記のようにして、「/users」のルーティング設定に新たに「confirmアクション」を追加します。
1 2 3 4 5 |
resources :users do collection do post :confirm end end |
下記のようなルーティング設定が追加されます。
1 |
confirm_users POST /users/confirm(.:format) users#confirm |
登録画面のソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<h1>New User</h1> <%= form_with(model: @user, local: true, url: confirm_users_path(@user)) do |form| %> <% if @user.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(user.errors.count, "error") %> prohibited this user from being saved:</h2> <ul> <% @user.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= form.label :name %> <%= form.text_field :name %> </div> <div class="actions"> <%= form.submit %> </div> <% end %> <%= link_to 'Back', users_path %> |
確認画面のソース
「送信する」と「入力画面に戻る」のsubmitを同じアクションに渡しています。ポイントとしては入力画面に戻るボタンでnameでback(どんな文字列でも良いです。)を渡しています。コントローラー側でnameの有無で処理を分岐させることができるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<%= form_with(model: @user, local: true) do |form| %> <%= form.hidden_field :name %> <div class="field"> <%= @user.name %> </div> <div class="actions"> <%= form.submit '入力画面に戻る', :name => 'back' %> </div> <div class="actions"> <%= form.submit '送信する' %> </div> <% end %> |
コントローラーのソース
ポイントは、create(登録処理)のなかの「if params[:back]」です。戻るボタンが押された時と、登録を実施したときで処理を分岐させることに成功しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
def confirm @user = User.new(user_params) end # POST /users # POST /users.json def create @user = User.new(user_params) if params[:back] render :new return end respond_to do |format| if @user.save format.html { redirect_to @user, notice: 'User was successfully created.' } format.json { render :show, status: :created, location: @user } else format.html { render :new } format.json { render json: @user.errors, status: :unprocessable_entity } end end end |
この記事へのコメントはありません。