Ruby on Rails:设计 – 首次登录时更改密码

我有一个应用程序,允许用户将项目输入数据库,他们可以在以后搜索它们。 每个用户都有自己的登录,由系统管理员发出。 当用户第一次登录时,我希望通常的主页显示“更改密码”视图,以便用户在使用应用程序之前必须更改密码。

我在User表中设置了一个pass_change布尔列,在创建新用户时该pass_change false

此时,当用户第一次登录时,会将其带到更改密码视图,但是当我测试此function时,密码不会更改,并且在我提交新密码后视图保持不变,并且该用户的pass_change不会更改为true

索引视图:

     
Database Search
What would you like to do?
"button", :method => "get" %>
"button", :method => "get" %>
Change your password
resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f| %>

申请助手:

 module ApplicationHelper def resource_name :user end def resource @resource ||= User.new end def devise_mapping @devise_mapping ||= Devise.mappings[:user] end end 

任何人都可以看到我可能做错了什么? 我正在使用devise gem来处理身份validation。 任何帮助都将非常感激。 提前致谢。

更新:

当我尝试更改密码时,这是我的日志:

 Started PUT "/users/password" for 127.0.0.1 at 2012-10-29 14:15:05 +0000 Processing by Devise::PasswordsController#update as HTML Parameters: {"utf8"=>"Ô£ô", "authenticity_token"=>"eBU5jvN6C+JSIZNmsEaxUyydrvPRjtGZeWLxlQzFJKI=", "user"=>{"password"= >"[FILTERED]", "password_confirmation"=>"[FILTERED]", "pass_changed"=>"true"}, "commit"=>"Change my password"} ←[1m←[35mUser Load (0.0ms)←[0m SELECT "users".* FROM "users" WHERE "users"."id" = 7 LIMIT 1 Redirected to http://localhost:3000/ Filter chain halted as :require_no_authentication rendered or redirected Completed 302 Found in 0ms (ActiveRecord: 0.0ms) Started GET "/" for 127.0.0.1 at 2012-10-29 14:15:05 +0000 Processing by ProjectsController#index as HTML ←[1m←[36mUser Load (0.0ms)←[0m ←[1mSELECT "users".* FROM "users" WHERE "users"."id" = 7 LIMIT 1←[0m ←[1m←[35mProject Load (0.0ms)←[0m SELECT "projects".* FROM "projects" Rendered projects/index.html.erb within layouts/application (0.0ms) Completed 200 OK in 16ms (Views: 15.6ms | ActiveRecord: 0.0ms) 

我的索引视图现在看起来像这样:

     
Database Search
What would you like to do?
"button", :method => "get" %>
"button", :method => "get" %>
:user, :url => password_path(current_user), :html => { :method => :put }) do |f| %>

在我的用户模型中,我添加了:

 after_update :update_pass_changed def update_pass_changed self.pass_changed = true self.save end 

试试这可能对你有帮助,写你的模特

 after_create :update_pass_change def update_pass_change self.pass_change = true self.save end 

要么

 def update_pass_change self.update_attributes(:pass_change => true) end