Rails 4 - 控制器之间的关联,id没有通过

时间:2014-05-14 09:42:11

标签: ruby-on-rails model-associations

我有两个控制器类别和产品。产品属于类别,但我无法建立关系。

在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

1 个答案:

答案 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]