首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails 4-控制器之间的关联,不能通过

Rails 4-控制器之间的关联,不能通过
EN

Stack Overflow用户
提问于 2014-05-14 09:42:11
回答 1查看 333关注 0票数 0

我有两个控制器类别和产品。产品属于类别,但我在建立这种关系方面有困难。

在category.rb中

代码语言:javascript
运行
复制
has_many :products

在product.rb中

代码语言:javascript
运行
复制
belongs_to :category

validates :category_id, :presence => true
validates :name, :presence => true, :uniqueness => true

当我尝试创建一个新产品时,由于category_id是空的,记录不会保存。我的产品表格看起来是这样的:

代码语言:javascript
运行
复制
<%= 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 %>

在产品控制器里我有:

代码语言:javascript
运行
复制
  def new
    @product = Product.new
    @category = @product.category
  end

我试着看过其他的问题,但没有任何运气找到正确的方法,把类别id传递给产品。我希望我已经足够清楚,我很高兴提供任何可能需要的额外信息。

编辑

我已经按照我的建议对产品控制器做了以下修改,但没有得到错误:找不到没有ID的类别

代码语言:javascript
运行
复制
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

我使用的是嵌套路径,如下所示:

代码语言:javascript
运行
复制
  resources :categories do 
    resources :products
  end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-14 09:45:47

您应该在create操作中设置产品的类别:

代码语言:javascript
运行
复制
def create
  @product = @category.products.new(product_params)
  # ...
end

new操作中,您应该只需要

代码语言:javascript
运行
复制
def create
  @product = Product.new
end

当然,您需要在前面设置@category (@category = Category.find(params[:category_id]))实例变量(例如,在before_filter中)。

如果不希望用户手动设置category_id并正确设置form_for参数,则还应该从视图中删除此隐藏字段,并从允许的params中删除form_for,因为您使用的是嵌套资源:

代码语言:javascript
运行
复制
form_for [@category, @product]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23650984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档