0

我正在建立一个分类的博客。我对如何在表单中实现分类有点坚持。我已经设置了一个有很多直通关系,并希望添加复选框以将博客与多个类别相关联。到目前为止,我将类别传递给视图,我可以将它们列出来,但是由于某种原因我无法让 form_for 方法工作。

这是我的代码。

博客模型

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

4

1 回答 1

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操作,则应将其删除,因为这应该生成对/blogs/:id. 假设您resources :blogs在 routes.rb 中使用,Rails 将根据用于呈现表单的操作为您确定正确的路径。

于 2012-10-25T21:14:47.610 回答