我有一个使用Devise进行身份验证的Rails 3.2应用程序。目前,new_user_registration
工作正常,edit_user_registration
路径均按设计工作。但是,我设计了一个标签式用户配置文件,用户可以访问各种表单(编辑注册,网站设置等)。
问题
虽然users#show
页面包含拉入表单以进行编辑注册的部分,但实际上并不允许用户进行编辑。我只想在用户控制器中重新创建一个edit
动作,但我想保留一些Devise的内置功能(例如丢失密码等,不确定是否有效)。
我有什么方法可以让用户在registrations#edit
视图中修改users#show
操作?
答案 0 :(得分:1)
您可以覆盖Devise的默认行为以使其生效。首先将show
动作引入设计RegistrationsController
,然后声明行动路线:
# app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
def show
end
end
# config/routes.rb
devise_for :users, :controllers => { :registrations => "registrations" }
devise_scope :user do
get "users/show"=> "users/registrations#show", :as => "show_registration"
end
然后,在您的RegistrationsController#show
操作中,创建一个resource
的实例以传递给视图:
# app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
def show
self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
end
最后,在show.html.erb
视图中添加一个表单,该表单将提交给RegistrationsController#update
操作。您可以直接从default Devise registration/edit.html.erb
template:
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
<%= devise_error_messages! %>
<div><%= f.label :email %><br />
<%= f.email_field :email, :autofocus => true %></div>
<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
<div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
<% end %>
<div><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
<%= f.password_field :password, :autocomplete => "off" %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>
<div><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
<%= f.password_field :current_password %></div>
<div><%= f.submit "Update" %></div>
<% end %>
end
瞧!您的自定义show
操作将包含一个表单,该表单将当前注册资源提交到默认的Devise RegistrationsController#update
操作。