Rails3入門之十一 建立乙個多模型的form

2021-09-30 09:05:16 字數 2495 閱讀 6932

你的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...