それじゃあ、Rolesコントローラでも作ろうか。
まあ、見出しの通りなんだけどwww
で、コントローラの生成。
今回は、
- index => roleの一覧
- show => roleの詳細
- edit => roleの編集
- new =>roleの新規作成
- create => roleの登録
- update => roleの更新
- 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
そんな感じですか。