Chen Yangjian's Blog

Carpe diem - Seize the day

在 Rails 3 中使用 Authlogic 的一个小问题

| Comments

最近组里头有个小项目,交给我做。我赶时髦用的 Rails 3,加入 Authlogic 的时候碰到些问题。

`undefined method `to_key' for #<usersession: no credentials provided>
`</usersession:>

按照 railscasts 的 authlogic 入门,一步步走下来,到创建用户登录表单的时候,在 Rails 3 中会碰到问题,丢出上面这个错误。Google 一看,在 Railsplugins.org 上碰到这个问题的人还真不少。

有一个比较简单直接的解决办法,修改 Rails 工程中的 Gemfile,把 authlogic 这个 gem 指向另外一个家伙临时 fix 的版本:

`gem 'authlogic', :git => 'git://github.com/odorcicd/authlogic.git', :branch => 'rails3'
`

就木有问题了。

然而问题还没有严重到要直接切换分支的程度。有位黑人兄弟指出了这么做的坏处

  1. 这并非官方版本,而官方版本也没有老掉牙,作者还在更新。
  2. 这么做并不保险。
  3. 还有个更简单的解决办法。

先看问题的起因。Rails 3 的 Routing 机制改变很大,routes.rb 不再像以前那么肥了。然而也引起了 authlogic 的问题。有两件事情它做不了了:

  1. authlogic 不能将 username/password 创建成 :user_session,导致 params[] 获取的时候出问题了
  2. authlogic 不知道该把哪个方法绑定到表单上去,导致 /app/controllers/user_sessions_controll.rb 里的 create 方法木有被召唤到。

所以,相应的也就有了解决办法:把 /app/views/user_session/new.html.erb 修改一下,原先可能是:

`<%= form_for @user_session do |f| %>
`

改成:

`<%= form_for @user_session, :as => :user_session, :url => { :action => "create" } do |f| %>
`

当然,也有个简单直接暴力的办法,给 /app/models/user_session.rb 加上 to_key 方法。不太好,最好别这么做。


一知半解,差不多全是翻译自 这里

Comments