それじゃあ、Rolesコントローラでも作ろうか。

まあ、見出しの通りなんだけどwww

で、コントローラの生成。
今回は、

  1. index => roleの一覧
  2. show => roleの詳細
  3. edit => roleの編集
  4. new =>roleの新規作成
  5. create => roleの登録
  6. update => roleの更新
  7. destroy => roleの削除

ってな感じなんだが。
viewが必要なのは、index、show、edit、newの4つだけ。

なんで、

$ script/generate controller Admin::Roles index show edit new

にした。

あと、restful_authentication_tutorialにならって、Rolesコントローラは、app/admin/以下に作ることにした。

ん、あそこ見ていて、ふっ、と気が付いたんだけど、別段、モデルとコントローラって、名前で結びついている必要、無いんだね。

んー、なんで、そう、思い込んでいたんだろう...

で、editアクションを作るにしても、roleにはidとnameしか無い訳で、そんなもん、みだりに編集してもらっては困るんで、とりあえず、descriptionの項目、作る。

$ script/generate migration AddColumnDescriptionToRole desctipiton:text

んで、編集...する必要、ないねwww

んじゃ、まず、コントローラ。
app/admin/roles_controller.rb

class Admin::RolesController < ApplicationController
+  skip_before_filter :login_required
  
  def index
    
  end

  def show
    
  end

  def edit
    
  end

  def new
    
  end

  def create
  end

  def update
    
    end
  end

  def destroy
    
  end
end

...それだけ?www
ってか、login_required外す?www
だって、作ってる段階で、ログインしないと確認できないんじゃ、面倒くさいじゃんwww

じゃあ、indexアクション作っちゃうよ。
app/admin/roles_controller.rb

  
  def index
+    @roles = Role.find(:all)
  end

いやあ、イイねえ、簡単でwww

んで、view。
app/views/admin/roles/index.html.erb

<h1>Admin::Roles#index</h1>
<p>Find me in app/views/admin/roles/index.html.erb</p>

<table>
  <thead>
    <tr>
      <th>
        ID
      </th>
      <th>
        Name
      </th>
      <th>
        Description
      </th>
      <th>
        Users
      </th>
      <th>
        Action
      </th>
    </tr>
  </thead>
  <tbody>
<%= render(:partial => "role", :collection => @roles) %>
  </tbody>
</table>

んで、partialテンプレート。
app/views/admin/roles/_roles.html.erb

<tr>
  <th>
    <%= role.id %>
  </th>
  <td>
    <%= link_to(role.name, admin_role_url(role.id)) %>
  </td>
  <td>
    <%= h(truncate(role.description, 80)) %>
  </td>
  <td>
    <ul>
      <% for user in role.users do %>
      <li>
        <%= link_to(user.nickname, user_path(user.id)) %>
      </li>
      <% end %>
    </ul>
  </td>
  <td>
    <ul>
      <li>
        <%= link_to("Edit", edit_admin_role_path(role.id)) %>
      </li>
      <li>
        <%= link_to("Delete", admin_role_path(role.id), :method => :delete) %>
      </li>
    </ul>
  </td>
</tr>

うはっwww
role.usersをforで回してるよwww
user増えたらどうするんだ? オレwww
つうか、administrator削除できるしwww
まあ、この辺は、あとで考えよう。

まあ、その内考えよう。うん。

んで、showアクション。
app/controllers/admin/roles_controller.rb

  def show
+    @role = Role.find_by_id(params[:id])
  end

これまた、簡素でwww
で、view。
app/views/admin/roles/show.html.erb

<table>
  <thead>
    <th>
      ID
    </th>
    <th>
      Name
    </th>
    <th>
      Description
    </th>
    <th>
      Users
    </th>
    <th>
      Action
    </th>
  </thead>
  <tbody>
    <%= render(:partial => "role", :object => @role) %>
  </tbody>
</table>

あ〜、手ぇ抜いちゃったwww
partialで書いちゃうと、descriptionがちょんぎられちゃうじゃんwww

まあ、これも、後々考えよう。
ご都合だねwww

それから、editアクション。

  def edit
+    @role = Role.find_by_id(params[:id])
  end

一行だけwww
で、view。
app/views/admin/roles/edit.html.erb

<%= error_messages_for :role %>

<% form_for(:role, :url => admin_role_path(@role), :html => { :method => :put }) do |f| %>
  <dl>
    <dt>
      ID
    </dt>
    <dd>
      <%= @role.id %>
    </dd>
    <dt>
      Name
    </dt>
    <dd>
      <%= @role.name %>
    </dd>
    <dt>
      Description
    </dt>
    <dd>
      <%= f.text_field(:description) %>
    </dd>
    <dt>
      Users
    </dt>
    <dd>
      <% for user in @role.users do %>
        <%= link_to(user.nickname, user_path(user.id)) %>
      <% end %>
    </dd>
  </dl>
<%= submit_tag('Save') %>
<% end %>

飛び先のupdateアクション。

  def update
+    @role = Role.find(params[:id])
+    if @role.update_attributes(params[:role])
+      flash[:notice] = "Role \"#{@role.name}\" updated"
+      redirect_to(admin_role_path(params[:id]))
+    else
+      render(:action => 'edit')
+    end
+  end

別段特別なことはしていませんな。
あ、これはviewは無しで。

次、newアクション。

  def new
+    @role = Role.new
  end

もう、ホント、こんなに単純でイイんですか?

イイんですっ!

んでもって、view。
app/views/admin/roles/new.html.erb

<%= error_messages_for :role %>

<% form_for(:role, :url => admin_roles_path) do |f| -%>
<dl>
  <dt>
    <%= label_tag('name') %>
  </dt>
  <dd>
    <%= f.text_field(:name) %>
  </dd>
  <dt>
    <%= label_tag('description') %>
  </dt>
  <dd>
    <%= f.text_field(:description) %>
  </dd>
</dl>

<p><%= submit_tag('Create') %></p>
<% end %>

んで、newから飛んでくcreateアクション。

  def create
+    @role = Role.new(params[:role])
+    if @role && @role.valid? 
+      @role.save!
+    end
+    success = @role && @role.valid?
+    if success && @role.errors.empty?
+      redirect_back_or_default(admin_roles_path)
+      flash[:notice] = "Role \"#{@role.name}\" was created !"
+    else
+      flash[:error]  = "We couldn't create Role \"#{@role.name}\"."
+      render(:action => 'new')
+    end
  end

それから、destroyアクション。

  def destroy
+    @role = Role.find(params[:id])
+    @role.destroy
+    redirect_to(admin_roles_path)
+    flash[:notice] = "Role \"#{@role.name}\" was deleted !"
  end


んじゃ、モデルに検証メソッド、付けましょうか。
つっても、アレじゃね? presenceとuniqueness見るくらいで、良いんじゃね?
あ、lengthもいるか? じゃあ、付けよう。

descriptionには、400文字くらいでwww
いらねーwww
app/models/role.rb

+  validates_presence_of     :name
+  validates_uniqueness_of   :name
+  validates_length_of       :name, :maximum => 100
+
+  validates_presence_of     :description
+  validates_length_of       :description, :maximum => 400

よし。
これで、一応のroleは出来たね。
ああ、後、アレ、だ。
ちょっと気になってたんだけど、userモデル、ちょっと書き換える。
app/models/user.rb

  def has_role?(role_in_question)
    @_list ||= self.roles.collect(&:name)
-    return true if @_list.include?("admin")
+    return true if @_list.include?(APP_CONFIG["role"]["administrator"])
    (@_list.include?(role_in_question.to_s) )
  end

これ、後々使うんだろうけど、なあ...

まあ、後だね、後。
もっと他に、やることある筈だし:-)

つうか、SNSなんだからなっ;-p

そんな感じですか。