从用户编辑设计#show view

时间:2013-12-15 21:04:16

标签: ruby-on-rails ruby-on-rails-3 devise

我有一个使用Devise进行身份验证的Rails 3.2应用程序。目前,new_user_registration工作正常,edit_user_registration路径均按设计工作。但是,我设计了一个标签式用户配置文件,用户可以访问各种表单(编辑注册,网站设置等)。

问题

虽然users#show页面包含拉入表单以进行编辑注册的部分,但实际上并不允许用户进行编辑。我只想在用户控制器中重新创建一个edit动作,但我想保留一些Devise的内置功能(例如丢失密码等,不确定是否有效)。

我有什么方法可以让用户在registrations#edit视图中修改users#show操作?

1 个答案:

答案 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操作。