Rails has_one关联设置

时间:2013-03-30 21:50:39

标签: ruby-on-rails associations belongs-to has-one

嗨,我是rails的新手,并且已经与这个has_one关联圈了几个小时。我有产品和皮肤,当我通过表格创建新产品时,我想使用选择框来选择与产品相关联的皮肤。

我想在皮肤表的模板列中保存haml文件的名称后,在/ skin / templates目录中使用haml文件渲染产品。

我得到的当前错误是:

undefined method `template' for nil:NilClass

控制器中的这一行:

render "/skins/templates/#{@product.skin.template}"

但是我也尝试过使用skin_id的其他各种配置,但是还没能通过它。

以下是代码:

products_controller.rb

class ProductsController < ApplicationController
  def show
    @product = Product.find(params[:id])

    if request.path != product_path(@product)
      redirect_to @product, status: :moved_permanently
    else 
      render "/skins/templates/#{@product.skin.template}"
    end
  end

  def new
    @product = Product.new

    respond_to do |format|
      format.html # new.html.haml
      format.json { render json: @product }
    end
  end

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

    respond_to do |format|
      if @product.save
        format.html { redirect_to @product, notice: 'Product was successfully created.' }
        format.json { render json: @product, status: :created, location: @product }
      else
        format.html { render action: "new" }
        format.json { render json: @product.errors, status: :unprocessable_entity }
      end
    end
  end
end

product.rb

class Product < ActiveRecord::Base
  attr_accessible :name, :skin
  has_one :skin
end

skin.rb

class Skin < ActiveRecord::Base
  attr_accessible :product, :name, :template
  belongs_to :product
end

_form.html.haml

= form_for @product do |f|

  - if @product.errors.any?
    #error_explanation
      %h1= "#{pluralize(@product.errors.count, "error")} prohibited this product from being saved:"
      %ul
        - @product.errors.full_messages.each do |msg|
          %li= msg

  .field
    = f.label :name
    = f.text_field :name

  = f.select :skin_id, Skin.all.collect{|t| [t.name, t.id]}

  .actions
    = f.submit 'Save'

产品表

id  |     name     |         created_at         |         updated_at         
----+--------------+--------------------------------------------------------
  1 | test         | 2013-03-30 18:01:42.102505 | 2013-03-30 18:01:42.102505

皮肤表

 id |  name   | template |         created_at         |         updated_at         | product_id  
----+---------+----------+----------------------------+----------------------------+------------
  1 | Product | product  | 2013-03-30 20:13:26.374145 | 2013-03-30 20:13:26.374145 |             

1 个答案:

答案 0 :(得分:0)

皮肤记录中的

product_id是空的......但看起来你的产品应该是“belongs_to”皮肤

1)将skin_id添加到product表中,并从皮肤表中删除product_id 2)更改产品型号

 class Product < ActiveRecord::Base
      attr_accessible :name, :sku, :skin_id
      belongs_to :skin
      validates_presence_of :skin  #add validation
    end

3)皮肤模型

class Skin < ActiveRecord::Base
  attr_accessible  :name, :template
  has_many :products
end