ruby-on-rails - Rails - 是否可以使用参数重定向到自定义路径?

标签 ruby-on-rails ruby ruby-on-rails-4 authentication authorization

所以我在做一个授权系统。新的注册页面设置为“/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 页面是 UsersControllernew 操作的结果。此页面包含表格。提交此表单后,数据从同一 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/

相关文章:

ruby-on-rails - 带有 rspec 和 factory_girl_rails 的 Rails 4 安装引擎

ruby-on-rails - Resque-Scheduler 不能与 Rails 4.2 中的 ActiveJob 一起使用

ruby-on-rails - Bundler 如何利用 Gemfile.lock 加载 gems?

html - 如何将选定的按钮存储在参数中?

sql - 为什么 Timeout.timeout(sec) 不适用于 activerecord

ruby-on-rails - 如何使用 Ruby 客户端为服务器到服务器应用程序设置 Google Calendar API

ruby-on-rails - ActiveRecord :Module 的未定义方法 `belongs_to'

ruby-on-rails - 用于用户博客的 Rails gem

mysql - 数据库 :schema:load vs db:migrate with capistrano

ruby-on-rails - Rails 类似 Facebook 的通知