你的blog還有乙個功能是給部落格加上tag。需要實現這個功能的話需要你在乙個form中實現多個模型的互動。
rails支援巢狀的form。
為了實現這些,我們將新增每個post多個tag。當你新建post時候,可以有多個tag。
首先我們增加tag模型。
$ rails generate model tag name:string post:references
然後執行db整合建立新錶
$ rake db:migrate
現在需要編輯post.rb建立關係。告訴rails你想通過post建立標籤tag。
class post < activerecord::base
validates :name, :presence => true
validates :title, :presence => true,
:length =>
has_many :comments, :dependent => :destroy
has_many :tags
accepts_nested_attributes_for :tags, :allow_destroy => :true,
:reject_if => proc }
end
:allow_destroy的意思是告訴rails顯示乙個remove的checkbox。
:reject_if表示將會阻止儲存新的tags。如果沒有任何屬性的話。
我們編輯 views/posts/_form.html.erb 來處理乙個tag模板
<% @post.tags.build %>
<%= form_for(@post) do |post_form| %>
<% if @post.errors.any? %>
<% end %>
<%= post_form.label :name %>
<%= post_form.text_field :name %>
<%= post_form.label :title %>
<%= post_form.text_field :title %>
<%= post_form.label :content %>
<%= post_form.text_area :content %>
<%= render :partial => 'tags/form',
:locals => %>
<%= post_form.submit %>
<% end %>
你發現我們改了
form_for(@post) do |f|是為了**理解更加
容易。這個例子展示了render的另外乙個選項,為了傳遞乙個本地變數。
在這個例子中,我們想本地變數form代替post_form物件。
我們也在頭上加了個@post.tags.build 。這個保證有乙個新的
tag可以被使用者新增name。如果你不新建乙個tag,這個頁面將不會
顯示因為沒有新的tag物件來建立。
這個頁面包含tag的form。
<%= form.fields_for :tags do |tag_form| %>
<%= tag_form.label :name, 'tag:' %>
<%= tag_form.text_field :name %>
<% unless tag_form.object.nil? || tag_form.object.new_record? %>
<%= tag_form.label :_destroy, 'remove:' %>
<%= tag_form.check_box :_destroy %>
<% end %>
<% end %>
最後我們編輯
<%= notice %>
name:<%= @post.name %>
title:<%= @post.title %>
content:<%= @post.content %>
tags:<%= @post.tags.map .join(", ") %>
<%= render @post.comments %><%= render "comments/form" %>
<%= link_to 'edit post', edit_post_path(@post) %> |
<%= link_to 'back to posts', posts_path %> |
做完這些,你會發現你可以編輯乙個post和tags在同一頁面。
但是@post.tags.map .join(", ")這個方法是不好的。
我們可以新建乙個helper方法來做這些,
Rails3 入門之三 新建乙個rails工程
如果你按照這個嚮導,你將會新建乙個rails工程叫blog,乙個非常簡單的webblog。在你開始新建乙個rails工程之前,請確保你是否安裝了rails.例子裡面使用 和 來表示終端的提示符。如果你使用windows,你的終端提示符 應該是像這樣的 c source code3.1 安裝rails...
Rails3入門之十 安全
如果你發布你的blog。那麼其他人就可以隨便修改和新增部落格了。rails提供了乙個非常簡單的http認證系統,可以非常有幫助的解決這種情況。在postscontroller裡面我們需要乙個方法阻止那些沒有授權的使用者的操作。這時候我們可以使用http basic authenticate with...
建立乙個rails3 engine
rails3中的engine 比較強大,現在寫gem,可以以 engine為基礎構建。而且慢慢地可以把rails程式分模組拆分。rails 3.1中更可以把engine以rake的方式載入。比如 建立乙個engine,有個 gem可讓我們的工作更加方便 url 事先安裝好enginex sudo g...