王筝的博客
ruby学习

进行中,未完待续

报错No route matches [GET] “/login”

 

Ruby 客户端 使用方法
0. 在 Gemfile中,加入:

gem ‘rubycas-client’
然后 $sudo bundle

注意: 不要使用 ‘rubycas-client-rails’ 这个GEM。这个gem会使得你的配置过程不透明,难于调试。

1. environment.rb: 的结尾,加上:

CASClient::Frameworks::Rails::Filter.configure(
:cas_base_url => “http://11.11.11.11:111″
)
2 对应的controller 中, 加上:

before_filter CASClient::Frameworks::Rails::Filter

注意: 不要在 application_controller中加这句。否则的话所有的controller, 包括登录页面都会受影响。

3. 在sessions_controller.rb 中定义退出的action:

class SessionsController < ApplicationController
  def destroy
    CASClient::Frameworks::Rails::Filter.logout(self)
  end
end

4. 修改 route.rb ,加入退出的链接:

PaddyField::Application.routes.draw do
   resources :fish
   match '/logout' => "sessions#destroy", :as => :logout, :via => :delete
end

5. 修改 application.html.erb 布局文件,增加这个链接。

关键的一点是: 在经典的rails authorization 框架用,都是用 current_user 这个变量取得当前登陆的用户。 在CAS CLIENT中,用的是 session[:cas_user] , 只取得当前用户名,是一个string. 而不是一个model.

<div style="border: 1px solid green">
  <%= session[:cas_user] %> 
</div>
<% if session[:cas_user] %>
  <%= link_to "logout" , logout_path %> 
<% end %>

单元测试中如何模拟登录?

非常简单,用这个

CASClient::Frameworks::Rails::Filter.fake("some_user")

例如:

# spec_helper.rb 
 def login
   CASClient::Frameworks::Rails::Filter.fake("some_user")
 end

然后就可以调用它了.

# in some rspec file
require 'spec_helper'

describe MessagesController do
  render_views
  before do
    login
    @message = FactoryGirl.create(:message, :vid => 1, :title => "test")
  end 
  it "should get show"  do  
    get :show, :id => @message.id
    response.should be_success
  end 
end