所以我在做一个授权系统。新的注册页面设置为“/signup”。如果注册无效(用户名已被占用,密码太短),我想显示错误。当我这样做时:
@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
它有效,但它呈现在“/users”而不是“/signup”中。而当代替
呈现"new"
我写
redirect_to '/signup'
它重定向,但不显示错误。是否可以重定向到“/signup”并保留错误?
用户.rb:
class User < ActiveRecord::Base
has_secure_password
validates :username, presence: true, :uniqueness => { :case_sensitive => false }
validates :password, presence: true, :length => {minimum: 6}
end
用户 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
新的.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
最佳答案
it works, but it renders in '/users' instead of '/signup'
这是正常行为。 /signup
页面是 UsersController
的 new
操作的结果。此页面包含表格。提交此表单后,数据从同一 Controller 进入 create
操作,但通过 POST
方法。
如果验证失败, Controller 将呈现 :new
模板,您还记得 create
操作有 /users
链接。所以你会在 /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| %>
关于ruby-on-rails - Rails - 是否可以使用参数重定向到自定义路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41087682/