2013-03-30 2 views
1

Привет, я новичок в рельсах и собираюсь в кругах с этой ассоциацией 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 |    
+0

вы пытаетесь использовать метод на нулевой объект. Если вы хотите этого избежать, просто используйте @ product.try (: skin) .try (: template) –

ответ

0

product_id в записи кожи пуст ... но выглядит как ваш продукт должен "belongs_to" кожи

1) добавить skin_id в таблицу продуктов и удалить 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 
+0

СПАСИБО! Это отлично работает. Мой единственный вопрос: почему кожа должна иметь много продуктов, а не продукт, имеющий один скин? –

+1

@greetification Продукт принадлежит коже, потому что он имеет ссылку на внешний ключ для кожи (skin_id). Из вашего описания кажется, что может быть много продуктов, использующих какой-либо один скин, и именно там их много. – graywh