将父模型的id传递给孩子的新内容并在rails上创建操作

时间:2014-12-17 17:14:21

标签: ruby ruby-on-rails-4

我的项目有2个型号,公司和产品。公司拥有众多产品和产品属于公司。我想在公司展示页面上添加Product的新操作链接,并将company_id传递给Product new action,以便新产品自动属于它所链接的公司。

如何更改以下代码才能实现此目的? 我的环境是ruby 2.0.0和rails 4.0.2

show.html.erb(公司)

<%= link_to "Add new product", new_product_path(company_id: @company) %>

products_controller.rb

def new
@product = Product.new(params[:company_id])
end

def create
    @product = Product.new(product_params, params[:company_id])
    if @product.save
        flash[:success] = "Product successfully created."
        redirect_to @product
    else
        render 'new'
    end
end

new.html.erb(产品)

<% provide(:title, 'New product') %>
<h1>Add a new product</h1>

<div class="row">
    <div class="span6 offset3">
        <%= form_for(@product) do |f| %>
            <%= render 'shared/error_messages', object: f.object %>

            <%= f.label :name, "Product Name" %>
            <%= f.text_field :name %>

            <%= f.label :description, "Description" %>
            <%= f.text_area :description %>

            <%= f.label :type, "Product Type" %>
            <%= f.text_field :type %>

            <%= f.label :released_date, "Released Date" %>
            <%= f.date_field :released_date %>

            #I want to omit below 2 lines by passing company_id from company show action
            <%= f.label :company_id, "Company ID" %> 
            <%= f.text_field :company_id %>

            <%= f.submit "Submit", class: "btn btn-large btn-primary" %>

        <% end %>
    </div>
</div>

:comapny_id传递给产品新操作,如URL所示。

http://localhost:3000/products/new?company_id=6

也显示在调试日志中。

company_id: '6'
action: new
controller: products

1 个答案:

答案 0 :(得分:0)

我认为您的错误在于您在新操作中创建新产品的方式。目前它只将公司ID本身传递给构造函数,但是你并没有告诉我应该用它来设置属性。

如果您将其更改为@product = Product.new(company_id: params[:company_id]),那么您的新产品对象应具有公司ID,并且应在创建表单中填写。然后,您可以使用隐藏字段,而不是省略字段。像这样,company_id没有额外的字段,但它仍然会自动添加到product_params中,而@product = Product.new(product_params)将创建一个带有company_id的产品。