2

私は認証システムを作っています。新しい登録ページは「/ signup」に設定されています。登録が無効である場合(ユーザー名はすでに取得済み、パスワードが短すぎます)、エラーを表示したいと思います。私はこのようにそれを行うと:Rails - paramsでカスタムパスにリダイレクトすることは可能ですか?

@user = User.create(user_params) 
    if @user.save 
     session[:user_id] = @user.id 
     redirect_to stories_path, notice: "Thanks for registration!" 
    else 
     render 'new' 
    end 

それは動作しますが、それは代わりに「/サインアップ」の「/ユーザの中でレンダリングします。そして、代わりの

がレンダリング時に '新しい'

は私が

redirect_to '/サインアップ'

それがリダイレクトを書きますが、エラーは表示されません。 '/ signup'にリダイレクトしてエラーを保存することは可能ですか?

user.rb:

class User < ActiveRecord::Base 
    has_secure_password 
    validates :username, presence: true, :uniqueness => { :case_sensitive => false } 
    validates :password, presence: true, :length => {minimum: 6} 
end 

users_controller.rb:

class UsersController < ApplicationController 
    def new 
     @user = User.new 
    end 

    def create 
     @user = User.create(user_params) 
     if @user.save 
      session[:user_id] = @user.id 
      redirect_to stories_path, notice: "Thanks for registration!" 
     else 
      render 'new' 
     end 
    end 

    private 

    def user_params 
     params.require(:user).permit(:username, :password) 
    end 
end 

new.html.erb:

<h3>New registration</h3> 

<%= simple_form_for @user do |f| %> 
    <div> <%= f.input :username %> 
    <%= f.error :username %></div> 
    <div><%= f.input :password %> 
    <%= f.error :password %></div> 

    <%= f.button :submit %> 
<% end %> 

とroutes.rbを:

Rails.application.routes.draw do 
    root 'stories#index' 
    resources :stories 
    resources :users 
    get 'signup' => 'users#new' 
end 

答えて

1

それは動作しますが、それはそれは正常な動作です代わりに「/サインアップ」

の '/ユーザーにレンダリングします。 /signupページは、newの処理の結果です。UsersControllerです。このページにはフォームが含まれています。このフォームを送信した後、同じコントローラからのデータはcreateになりますが、方法はPOSTです。

コントローラが:newテンプレートをレンダリングして失敗すると、覚えているようにcreateアクションには/usersというリンクがあります。だからリンクに:newテンプレートが表示されます。ここで

UsersControllerのためのルートマップです:

  GET /users(.:format)    users#index 
      POST /users(.:format)    users#create 
new_user GET /users/new(.:format)   users#new 
edit_user GET /users/:id/edit(.:format)  users#edit 
    user GET /users/:id(.:format)   users#show 
      PUT /users/:id(.:format)   users#update 
      DELETE /users/:id(.:format)   users#destroy 

あなたはroutes.rbにルートを追加することができ、あなたの要件を達成するために。フォームのURLを変更します。このような

何か:

post 'signup` => 'users#create` 

とフォームで:

<%= simple_form_for(@user, url: HERE_IS_SIGNUP_PATH) do |f| %> 
関連する問題