2012-05-14 51 views
5

Tôi đang sử dụng đường ray để tạo sản phẩm mới và muốn thêm danh mục vào mọi sản phẩm.Đường ray thuộc tính lồng nhau - cách thêm thuộc tính danh mục vào sản phẩm mới?

Tôi có ba bảng: sản phẩm, danh mục và phân loại (lưu trữ mối quan hệ giữa các sản phẩm và danh mục). Tôi đang cố gắng sử dụng các thuộc tính lồng nhau để quản lý việc tạo các phân loại, nhưng không chắc chắn cách trình điều khiển và khung nhìn/biểu mẫu của tôi nên được cập nhật để các sản phẩm mới cũng cập nhật bảng phân loại.

Dưới đây là mô hình của tôi:

class Product < ActiveRecord::Base 
belongs_to :users 
has_many :categorizations 
has_many :categories, :through => :categorizations 
has_attached_file :photo 
accepts_nested_attributes_for :categorizations, allow_destroy: true 

attr_accessible :description, :name, :price, :photo 

validates :user_id, presence: true 

end 


class Category < ActiveRecord::Base 
attr_accessible :description, :name, :parent_id 
acts_as_tree 
has_many :categorizations, dependent: :destroy 
has_many :products, :through => :categorizations 

end 


class Categorization < ActiveRecord::Base 
    belongs_to :category 
    belongs_to :product 
    attr_accessible :category_id, :created_at, :position, :product_id 

end 

Dưới đây là bộ điều khiển sản phẩm mới của tôi:

def new 
    @product = Product.new 

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

Và đây là hình thức quan điểm của tôi:

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

     <ul> 
     <% @product.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.label :description %><br /> 
    <%= f.text_field :description %> 
    </div> 
    <div class="field"> 
    <%= f.label :price %><br /> 
    <%= f.number_field :price %> 
    </div> 
<div class="field"> 
<%= f.file_field :photo %> 
</div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

Làm thế nào tôi nên cập nhật bộ điều khiển của tôi sao cho cả bảng sản phẩm và bảng phân loại được cập nhật khi một sản phẩm mới được thêm vào? Làm cách nào để cập nhật tệp xem của tôi để các danh mục xuất hiện trong trình đơn thả xuống?

+0

* nhưng không chắc chắn như thế nào tôi ... xem/biểu mẫu phải được cập nhật * - chúng tôi cũng không có ý tưởng nào vì bạn không hiển thị chúng. – jdoe

+0

Xin chào @jdoe - Tôi đã thêm tệp xem tại đây. Chỉ một tiêu chuẩn được tạo ra bởi các lệnh tạo ra đường ray. –

Trả lời

4

Tôi thấy rằng sản phẩm has_many danh mục. Nó tự nhiên cho phép người dùng chỉ định chúng khi tạo/ấn bản sản phẩm. Một cách tiếp cận được mô tả here (thông qua hộp kiểm để gán danh mục cho sản phẩm của bạn). Một cách khác: tạo sản phẩm như thường và cho phép thêm/gỡ bỏ các loại trên trang chỉnh sửa của nó, như:

cat_1 [+] 
cat_2 [-] 
cat_3 [+] 

Ngoài ra hãy xem tại Railcasts, như this one để thực hiện nó trên một cách đẹp hơn.

0

Trước hết để hiển thị loại theo quan điểm của tập tin sử dụng cái gì đó như sau để hiển thị mục trong danh sách thả xuống

<%= select_tag("category_id[]", options_for_select(Category.find(:all).collect { |cat| [cat.category_name, cat.id] }, @product.category.collect { |cat| cat.id}))%> 

Sau đó, trong tạo phương pháp điều khiển sản phẩm làm một cái gì đó như sau

@product = Product.create(params[:category]) 
@product.category = Category.find(params[:category_id]) if params[:category_id] 

Tôi hy vọng điều này sẽ giúp bạn.
Cảm ơn.

0

Hướng dẫn cho Mẫu mô hình lồng nhau từ RailsCasts Có thể giúp bạn hoặc có thể sẽ giúp người khác.

0

Dưới đây là những gì tôi addded đến tập tin xem sản phẩm của tôi, trong _form.html - điều này tạo ra nhiều hộp kiểm mà tôi có thể sử dụng để chọn nhiều loại cho mỗi sản phẩm:

</div class="field"> 
<% Category.all.each do |category| %> 
<%= check_box_tag "product[category_ids][]", category.id %> 
<%= label_tag dom_id(category), category.name %><br> 
<% end %> 
Các vấn đề liên quan