前回の記事はこちら。
「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様様って感じで、確かによく似ていると思う。
あとは細かい、裏側で何が行われているのかをちょっと把握しながらやらないと、こんがらがっちゃうなあとは思った。
あとは公式サイトの使い方覚えないと(まず英語を怖がらないようにしないと)