我有两个控制器类别和产品。产品属于类别,但我在建立这种关系方面有困难。
在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我试着看过其他的问题,但没有任何运气找到正确的方法,把类别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发布于 2014-05-14 09:45:47
您应该在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并正确设置form_for参数,则还应该从视图中删除此隐藏字段,并从允许的params中删除form_for,因为您使用的是嵌套资源:
form_for [@category, @product]https://stackoverflow.com/questions/23650984
复制相似问题