Привет, я новичок в рельсах и собираюсь в кругах с этой ассоциацией has_one в течение нескольких часов. У меня есть продукты и скины, и когда я создаю новый продукт через форму, я бы хотел использовать поле выбора, чтобы выбрать скин для связи с продуктом.Rails has_one association setup
Я хочу затем отобразить продукт с помощью файла 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 |
вы пытаетесь использовать метод на нулевой объект. Если вы хотите этого избежать, просто используйте @ product.try (: skin) .try (: template) –