この一連のエントリは
Ruby on Rails 3 Tutorial: Learn Rails by Example (Addison-Wesley Professional Ruby Series)
で参考に学んだことを凝縮してお送りしています。
Ruby on Rails 3 Tutorial: Learn Rails by Example (Addison-Wesley Professional Ruby Series)
で参考に学んだことを凝縮してお送りしています。
今度は登録ユーザーの一覧が見えるindexアクションを実装しましょう。
例によってテストから作成するのですが、ユーザー一覧を検証したいのでユーザー数はある程度欲しいところではあります。
以前導入したFactoryGirlの機能を使えばそれも簡単です。
spec/factories.rb に以下の定義を追加します。
Factory.sequence :name do |n|このようにFactory.sequenceメソッドを使って定義すると「Factory.next(:name)」とすることで続々と「Tarou1」「Tarou2」とユーザー名を生成することが出来ます。
"Tarou#{n}"
end
では試験コードです。
spec/controller/users_controller_spec.rbに以下のindexアクション用の検証コードを追加します。
describe "GET 'index'" do
describe "未認証ユーザーの検証"do
it "サインインページに飛ばす" do
get :index
response.should redirect_to(new_session_path)
flash[:notice].should =~ /サインインしてください/
end
end #未認証ユーザーの検証
describe"認証済みユーザーの検証" do
before(:each) do
@user = Factory(:user)
controller.sign_in(@user)
second = Factory(:user, :name => "Jirou")
third = Factory(:user, :name => "Saburou")
@users = [@user, second,third]
30.times do
@users << Factory(:user, :name => Factory.next(:name))
end
end
it "アクセスできること" do
get :index
response.should be_success
end
it "タイトル検証" do
get :index
response.should have_selector("title", :content => "ユーザー一覧")
end
it "ユーザー名のリストを表示していること" do
get :index
@users[0..2].each do |user|
response.should have_selector("li", :content => user.name)
end
end
end #認証済みユーザーの検証
end #GET index
特に目新しいものはないんですが、認証済みユーザーの検証をするbeforeブロックで先ほど定義したFactory.next(:user)を使ってユーザー名を自動生成しています。
ではアクションを定義しましょう。
before_filter :authenticate, :only => [:show, :index]前回定義したbefore_filterにindexアクションを追加します。
def index
@title = "ユーザー一覧"
@users = User.all
end
複数指定するときは配列になります。
indexアクションではUser.allで全ユーザーを取得しています。
次はindexに対応したviewを作成します。app/views/users/index.html.erbファイルを作成した以下のように編集します。
<h1>ユーザー一覧</h1>複数存在するユーザーごとに同じタグを適用することになるので、ここでは部分テンプレートを使用しています。renderメソッドに渡した値に応じた部分テンプレートに該当部分が置き換えられます。
<ul class="users">
<%= render @users %>
</ul>
通常は「render 'hoge'」などと指定して、対応する「_hoge.html.erb」に置き換えられます。ここではindexアクションで格納したUser配列をまとめて渡しています。こうすると自動的に1つ1つの要素に分解して部分テンプレートを適用してくれます。
このとき対応するテンプレートは「_user.html.erb」となります。部分テンプレートの先頭には「_」がつきます。
ではその_user.html.erbを以下のように作成しましょう。
<li>link_toメソッドは1つめのパラメータを値に、2つ目のパラメータをリンク先にaタグを生成します。上記の例ではリンク先としてuserを渡していますが、これも例によって「/users/:id」に変換されます。
<%= link_to user.name, user %>
</li>
0 件のコメント:
コメントを投稿