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により、へのPUTリクエストが生成されるため/blogs/:idです。あなたがroutes.rbで使用resources :blogsしたと仮定すると、Railsは、フォームのレンダリングに使用されたアクションに基づいて、正しいパスを決定します。

于 2012-10-25T21:14:47.610 に答える