Rails 添加新的视图来设计

wwl*_*wli 2 ruby ruby-on-rails devise

安装设备后,我使用此命令生成了视图

rails generate devise:views
Run Code Online (Sandbox Code Playgroud)

我覆盖注册控制器

class RegistrationsController < Devise::RegistrationsController

  def sign_up2

  end
end
Run Code Online (Sandbox Code Playgroud)

并更新了 routes.rb

  devise_for :users, :controllers => { :registrations => "registrations" }  
Run Code Online (Sandbox Code Playgroud)

我希望看到一条新的路线/视图

  /users/sign_up2
Run Code Online (Sandbox Code Playgroud)

但我没有看到它在这里设计路线

        new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
            user_session POST   /users/sign_in(.:format)       devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
           user_password POST   /users/password(.:format)      devise/passwords#create
       new_user_password GET    /users/password/new(.:format)  devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                         PATCH  /users/password(.:format)      devise/passwords#update
                         PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        registrations#cancel
       user_registration POST   /users(.:format)               registrations#create
   new_user_registration GET    /users/sign_up(.:format)       registrations#new
  edit_user_registration GET    /users/edit(.:format)          registrations#edit
                         PATCH  /users(.:format)               registrations#update
                         PUT    /users(.:format)               registrations#update
                         DELETE /users(.:format)               registrations#destroy
Run Code Online (Sandbox Code Playgroud)

但我想要一个新的观点和路线

更新:加载视图时的问题

First argument in form cannot contain nil or be empty
Run Code Online (Sandbox Code Playgroud)

在这一行

<%= form_for(resource, :as => resource_name,:html => { :class => "form-horizontal col-sm-12",:role=>"form"}, :url => user_registration_path(resource_name)) do |f| %>
Run Code Online (Sandbox Code Playgroud)

zea*_*soi 5

调用一个devise_scope块并在其中声明您的自定义路由:

devise_for :users, :controllers => { :registrations => "registrations" }  
devise_scope :user do
  get "users/sign_up2"=> "users/registrations#sign_up2", :as => "sign_up2_registration"
end
Run Code Online (Sandbox Code Playgroud)

文档中关于配置路由的部分提供了以下解释devise_scope

如果您需要更深入的定制,例如除了“/users/sign_in”之外还允许“/sign_in”,您需要做的就是正常创建您的路由并将它们包装在路由器中的 devise_scope 块中

以前,Devise 允许将自定义路由作为块传递给devise_for,但此行为已被弃用

更新

要解决该First argument in form cannot contain nil or be empty错误,您需要确保您的自定义sign_up2操作正确设置了resource变量。假设你想模仿这个registrations/new动作,你可以做一些类似于以下的事情:

def sign_up2
    build_resource({})
    respond_with self.resource
end
Run Code Online (Sandbox Code Playgroud)

这可确保resource您视图中的变量不会nil也不会抛出您当前看到的异常。

或者,根据您尝试证明的行为,您可以在自定义控制器操作中设置自己的实例变量,然后将其作为资源传递给您的form_for标签:

# app/controllers/users/registrations_controller.rb
def sign_up_2
    @new_registrant = Registrant.new
end

# app/views/users/sign_up2.html.erb
<%= form_for(@new_registrant, :as => resource_name,:html => { :class => "form-horizontal col-sm-12",:role=>"form"}, :url => user_registration_path(resource_name)) do |f| %>
Run Code Online (Sandbox Code Playgroud)

但是,如果您遵循这种方法,您应该考虑为什么需要将其纳入 Devise。默认情况下,设计resource通过build_resource函数分配变量。如果你打算覆盖/绕过这个函数,你应该考虑从 Devise 中抽象出整个功能,因为你完全绕过了它的默认行为。