嗨,我是rails的新手,并且已经与这个has_one关联圈了几个小时。我有产品和皮肤,当我通过表格创建新产品时,我想使用选择框来选择与产品相关联的皮肤。
我想在皮肤表的模板列中保存haml文件的名称后,在/ skin / templates目录中使用haml文件渲染产品。
我得到的当前错误是:
undefined method `template' for nil:NilClass
控制器中的这一行:
render "/skins/templates/#{@product.skin.template}"
但是我也尝试过使用skin_id的其他各种配置,但是还没能通过它。
以下是代码:
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
class Product < ActiveRecord::Base
attr_accessible :name, :skin
has_one :skin
end
class Skin < ActiveRecord::Base
attr_accessible :product, :name, :template
belongs_to :product
end
= 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 |
答案 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