我有两个控制器类别和产品。产品属于类别,但我无法建立关系。
在category.rb
中has_many :products
在product.rb
中belongs_to :category
validates :category_id, :presence => true
validates :name, :presence => true, :uniqueness => true
当我尝试创建新产品时,记录不会保存,因为category_id为空。我的产品形式如下:
<%= form_for @product, :html => { :class => 'form-horizontal' } do |f| %>
<%= f.hidden_field('category_id', :value => params[:category_id]) %>
<div class="control-group">
<%= f.label :name, :class => 'control-label' %>
<div class="controls">
<%= f.text_field :name, :class => 'text_field' %>
</div>
</div>
<div class="control-group">
<%= f.label :category, :class => 'control-label' %>
<div class="controls">
<% @cat = Category.all %>
<%= select_tag 'category', options_from_collection_for_select(@cat, 'id', 'name') %>
</div>
</div>
<div class="control-group">
<%= f.label :price, :class => 'control-label' %>
<div class="controls">
<%= f.text_field :price, :class => 'text_field' %>
</div>
</div>
<div class="control-group">
<%= f.label :description, :class => 'control-label' %>
<div class="controls">
<%= f.text_area :description, :class => "tinymce", :rows => 10, :cols => 120 %>
<%= tinymce %>
</div>
</div>
<div class="form-actions">
<%= f.submit nil, :class => 'btn btn-primary' %>
<%= link_to t('.cancel', :default => t("helpers.links.cancel")),
products_path, :class => 'btn' %>
</div>
<% end %>
在产品控制器中我有:
def new
@product = Product.new
@category = @product.category
end
我已经尝试在SO上查看其他问题但是没有运气找到将类别ID传递给产品的正确方法。 我希望我已经足够清楚,我很乐意提供可能需要的任何额外信息。
修改
我已根据建议对产品控制器进行了以下更改:我没有收到错误:找不到没有ID的类别
before_filter :set_category, only: [:create]
def set_category
@category = Category.find(params[:category_id])
end
def create
@product = @category.products.new(product_params)
#....
end
我正在使用嵌套路线:
resources :categories do
resources :products
end
答案 0 :(得分:0)
您应该在create
操作中设置产品类别:
def create
@product = @category.products.new(product_params)
# ...
end
在new
行动中,你应该只有
def create
@product = Product.new
end
当然,您需要先设置@category
(@category = Category.find(params[:category_id])
)实例变量(例如,在before_filter
中)。
如果您不希望用户手动设置category_id
并正确设置category_id
参数,则还应从视图中删除此隐藏字段并从允许的参数中删除form_for
您正在使用嵌套资源:
form_for [@category, @product]