最近组里头有个小项目,交给我做。我赶时髦用的 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'
`
就木有问题了。
然而问题还没有严重到要直接切换分支的程度。有位黑人兄弟指出了这么做的坏处:
- 这并非官方版本,而官方版本也没有老掉牙,作者还在更新。
- 这么做并不保险。
- 还有个更简单的解决办法。
先看问题的起因。Rails 3 的 Routing 机制改变很大,routes.rb 不再像以前那么肥了。然而也引起了 authlogic 的问题。有两件事情它做不了了:
- authlogic 不能将 username/password 创建成
:user_session
,导致 params[] 获取的时候出问题了 - 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
方法。不太好,最好别这么做。
一知半解,差不多全是翻译自 这里