2012-10-25 42 views
0

我正在建立一個分類博客。我有點卡在如何在表單中實現分類。我已經建立了一個有很多通過關係,並希望添加複選框以將博客與多個類別相關聯。我到目前爲止是將類別傳遞給視圖,並且我可以列出它們,但是我無法獲得form_for方法,因爲某些原因。學習rails,試圖構建博客分類

這是我的代碼。

博客模型

class Blog < ActiveRecord::Base 
    attr_accessible :body, :title, :image 
    has_many :categorizations 
    has_many :categories, through: :categorizations 
    has_attached_file :image, :styles => { :medium => "300x300>", :thumb => "100x100>" } 

    validates :title, :body, :presence => true 

end 

類別型號

class Category < ActiveRecord::Base 
    has_many :categorizations 
    has_many :blogs, through: :categorizations 
    attr_accessible :name 
end 

分類模型

class Categorization < ActiveRecord::Base 
    attr_accessible :blog_id, :category_id 
    belongs_to :blog 
    belongs_to :category 
end 

博客新的控制器

def new 
    @blog = Blog.new 
    @categories = Category.all 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @blog } 
    end 
    end 

博客新的表單視圖

<%= form_for(@blog, :url => blogs_path, :html => { :multipart => true }) do |f| %> 
    <% if @blog.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@blog.errors.count, "error") %> prohibited this blog from being saved:</h2> 

     <ul> 
     <% @blog.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 
    <div class="field"> 
    <%= f.label :title %><br /> 
    <%= f.text_field :title %> 
    </div> 
    <div class="field"> 
    <%= f.file_field :image %> 
    </div> 
    <div class="field"> 
    <%= f.label :body %><br /> 
    <%= f.text_area :body %> 
    </div> 
    <div class="field"> 
    Categories: 
    <% @categories.each do |category| %> 
     <% fields_for "blog[cat_attributes][]", category do |cat_form| %> 
     <p> 
      <%= cat_form.check_box :name %> 
     </p> 
     <% end %> 
    <% end %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

此代碼是我的故障點

<% @categories.each do |category| %> 
      <% fields_for "blog[cat_attributes][]", category do |cat_form| %> 
      <p> 
       <%= cat_form.check_box :name %> 
      </p> 
      <% end %> 
     <% end %> 

雖然我不積極,我接近它的任何正確的,因爲我正在學習。有關如何完成此任務的任何建議。

感謝, CG

回答

0

首先,你可能不除非有你有沒有在這裏描述的用例需要一個單獨的Categorization模型。您可以設置這樣的許多一對多的關係:

class Blog < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
end 

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :blogs 
end 

你應該有一個數據庫表是這樣的:

class CreateBlogsCategories < ActiveRecord::Migration 
    def change 
    create_table :blogs_categories, id: false do |t| 
     t.references :blog 
     t.references :category 
    end 
    end 
end 

然後你就可以構建看法是這樣的:

<div class="field"> 
    Categories: 
    <% @categories.each do |category| %> 
    <%= label_tag do %> 
     <%= check_box_tag 'blog[category_ids][]', category.id, @blog.category_ids.include?(category.id) %> 
     <%= category.name %> 
    <% end %> 
    <% end %> 
</div> 

最後,在您的form_for中,您指定url: blogs_path - 如果您打算將此表單用於edit操作,則應刪除此操作,因爲該操作應該爲ge將PUT請求納入/blogs/:id。假設您在routes.rb中使用了resources :blogs,Rails將根據用於呈現表單的操作確定正確的路徑。

+0

感謝這似乎工作。我使用了很多通過技巧,Rails演示說,擁有和屬於許多是不太流行的做這種事情的方式。然而,表單邏輯似乎適用於兩者。感謝您的幫助 :) –