前回の記事はこちら。
「Getting Started with Rails」をやってみた(2)

結構間が空いてしまったので、忘れてるなあ・・・。
けど、とりあえず終わらせるぞ。

10.セキュリティ

次はセキュリティって書いてあったけど、Basic認証のかけ方。
すげー簡単。

# /app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery

  private

  def authenticate
    authenticate_or_request_with_http_basic do |user_name, password|
      user_name == 'admin' && password == 'password'
    end
  end
end

authenticateってアクションを追加。
privateってのはメソッドの呼び出せるスコープかな。
なんか本で読んだ気がするぞ。

# /app/controllers/posts_controller.rb

+ before_filter :authenticate, :except => [:index, :show]

Postsコントローラは参照系以外は全部認証が必要に。

# /app/controllers/comments_controller.rb

+ before_filter :authenticate, :only => :destroy

Commentsコントローラは削除だけ認証をかける。
before_filterはフックを設定するためのメソッドだろうな。
最初がメソッド名で、次が引数って感じかな?
これはコントローラ部分のヘルプを見ればわかりそうだ。
この辺もCakePHPと似ている。

っつうことで、結構簡単に実装できた。
Usersコントローラ作って・・・って奴もどこかでみとないとな。
まあ、個人利用のブログにいらんけど。

11.マルチモデルフォームの作成

次はマルチモデルフォーム?
タグ機能を追加する方法っぽいな、助かるぜ。

書かれているままデータベースの作成など。

$ rails generate model tag name:string post:references
$ rake db:migrate
# /app/controllers/posts_controller.rb

+ has_many :tags

+  accepts_nested_attributes_for :tags, :allow_destroy => :true,
+    :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } }

Postsコントローラを編集。
これが全くわからないので、調べてみた。
これはモデルが親子関係の時とか、子どもも一緒に更新するか?そん時は削除も許可するか、どんな時は拒否するか?みたいな設定ができるっぽい。

んで、ビューも変更しろだと。
まずはフォーム部分。

# /app/views/posts/_form.html.erb

  <div class="field">
    <%= post_form.label :content %><br />
    <%= post_form.text_area :content %>
  </div>
+ <h2>Tags</h2>
+ <%= render :partial => 'tags/form',
+            :locals => {:form => post_form} %>
  <div class="actions">
    <%= post_form.submit %>
  </div>

これは単純にタグを入力する部分の追加って事なんだろうな。

んで呼び出しているパーツを生成。

# /app/views/tags/_form.html.erb

<%= form.fields_for :tags do |tag_form| %>
  <div class="field">
    <%= tag_form.label :name, 'Tag:' %>
    <%= tag_form.text_field :name %>
  </div>
  <% unless tag_form.object.nil? || tag_form.object.new_record? %>
    <div class="field">
      <%= tag_form.label :_destroy, 'Remove:' %>
      <%= tag_form.check_box :_destroy %>
    </div>
  <% end %>
<% end %>

もはや何が何だか。
意味はなんとなくわかるんだけどねえ。
どの変数にどんなオブジェクトが入っているかってのが、もはや追えないな。
tagsってフィールドの中にlabelとかtext_fieldとかがあるってのがまだよくわかってないな。
ま、そりゃいきなりわかったら怖いけど。

showのテンプレートにも追加

  <p class="notice"><%= notice %></p>

  <p>
    <b>Content:</b>
    <%= @post.content %>
  </p>

+ <p>
+   <b>Tags:</b>
+   <%= @post.tags.map { |t| t.name }.join(", ") %>
+ </p>

  <h2>Comments</h2>
  <%= render :partial => "comments/comment",
             :collection => @post.comments %>

joinして表示しているなあ。 なんかmapしてjoinしているのが美しくないらしいので、ヘルパーの登場っぽい。

12.ヘルパー

# /app/helpers/posts_helper.rb

  module PostsHelper
+   def join_tags(post)
+     post.tags.map { |t| t.name }.join(", ")
+   end
  end

ヘルパーはモジュールでつくるんだなー。

# /app/view/posts_helper.rb

<p>
  <b>Tags:</b>
- <%= @post.tags.map { |t| t.name }.join(", ") %>
+ <%= join_tags(@post) %>

ヘルパーを呼び出した意識はないんだけど、スコープはどうなっているんだ?

んで、とりあえず終了。

全体的な感想

CakePHP様様って感じで、確かによく似ていると思う。
あとは細かい、裏側で何が行われているのかをちょっと把握しながらやらないと、こんがらがっちゃうなあとは思った。

あとは公式サイトの使い方覚えないと(まず英語を怖がらないようにしないと)