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)
调用一个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 中抽象出整个功能,因为你完全绕过了它的默认行为。