Rails 3 Devise вручную сменить пароль - PullRequest
5 голосов
/ 07 июля 2011

Я пытаюсь использовать устройство в моем приложении rails. Но я не понимаю, как я могу дать пользователю функциональность, чтобы изменить его пароль. Мне нужна форма с полями «старый пароль», «новый пароль» и «подтверждение нового пароля». Как мне это сделать?

Если я использую форму устройства по умолчанию на странице "/ profile"

<%= render :template => 'devise/passwords/edit', 
                        :locals => { 
                          :resource => my_user_model_variable, 
                          :resource_name => my_user_model_name } %>

В user.rb содержится строка

attr_accessible :email, :password, :password_confirmation, :remember_me

Но там было undefined method 'devise_error_messages!' for #<#<Class:0x59b9200> и затем (после комментирования строки devise_error_messages!) undefined method 'password' for #<Class:0x59b9200> ошибок.

Я пытаюсь использовать свой собственный PasswordsController:

class PasswordsController < ApplicationController
  before_filter :authenticate_user!

  def edit
    @user = current_user
  end

  def update
    @user = current_user
    raise params.inspect
    if @user.update_with_password(params[:user])
      sign_in(@user, :bypass => true)
      redirect_to root_path, :notice => "Password updated!"
    else
      render :edit
    end
  end
end

и воспользуйтесь советом по этому вопросу: Визуализация формы пароля для редактирования устройства

вставить этот код

<%= render :template => 'passwords/edit', 
                    :locals => { 
                      :resource => current_user, 
                      :resource_name => User } %>

на страницу "/ profile".

пароли / edit.html.erb содержат этот код

<h2>Change your password</h2>
<%# raise resource.inspect %>
<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f| %>
  <%# devise_error_messages! %>
  <%= f.hidden_field :reset_password_token %>

  <p><%= f.label :password, "New password" %><br />
  <%= password_field_tag :name => "user[password]"%></p>
  <%= password_field_tag :name => "user[password_confirmation]"%></p>

  <p><%= f.submit "Change my password" %></p>
<% end %>

<%= render :partial => "devise/shared/links" %>

Но отображаемая форма имеет значение "/ profile" для атрибута действия и отправка этой формы ничего не делает.

Ответы [ 2 ]

11 голосов
/ 29 декабря 2011

Ваша форма должна быть, т.е. пароль / edit.html.erb

<%# raise resource.inspect %>
<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f| %>
  <%# devise_error_messages! %>
  <%= f.hidden_field :reset_password_token %>

   <p><%= f.label :current_password %><br />
   <%= f.password_field :current_password %></p>

  <p><%= f.label :password, "New password" %><br />
  <%= f.password_field :password %></p>

  <p><%= f.label :password_confirmation, "Confirm new password" %><br />
  <%= f.password_field :password_confirmation %></p>

  <p><%= f.submit "Change my password" %></p>
<% end %>

ПРОСМОТР :

<h3>Change password </h3>
<hr/>
<%= render :template => 'passwords/edit', 
                    :locals => { :resource => current_user, :resource_name => "user" } %>

Контроллер

class PasswordsController < ApplicationController
  before_filter :authenticate_user!

  def edit
    @user = current_user
  end

  def update
    @user = current_user
    # raise params.inspect
    if @user.update_with_password(params[:user])
      sign_in(@user, :bypass => true)
      redirect_to root_path, :notice => "Your Password has been updated!"
    else
      render :edit,:locals => { :resource => @user, :resource_name => "user" }
    end
  end
end

Маршруты

devise_for :users ,:controllers => {:passwords => "passwords"} do
  end

  resources :passwords

у меня работает;

0 голосов
/ 07 июля 2011

Что произойдет, если вы добавите кавычки вокруг пользователя, например:

<%= render :template => 'passwords/edit', 
                    :locals => { 
                      :resource => current_user, 
                      :resource_name => "User" } %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...