2016-04-05 32 views
1

Hammadde modelimde "name" özelliğini doğrulamaya çalışıyorum. Ancak, validates eklediğimde: name,: uniqueness => Ingredient modelimde true, ismini doğrulamıyor (aynı ada sahip içerik ekleyebilir). İçerik modelinin diğer modelle karmaşık bir ilişkisi vardır. Lütfen aşağıdaki kodu inceleyin.Raylar 4- Karmaşık model doğrulama (has_many, through)

Nihai hedefim, içeriğin Bileşen tablosunda olmaması durumunda kullanıcının içerik oluşturmasına izin vermektir. İçerik zaten mevcutsa, miktar için içerik maddesini kullanın. Bunu nasıl başaracağına dair herhangi bir fikri varsa, lütfen çözümü sağlayın. Şimdiden teşekkürler. Madde oluşturmak için

ingredient.rb

class Ingredient < ActiveRecord::Base 
    has_many :quantities 
    has_many :recipes, through: :quantities 

    validates :name, :presence => true, :uniqueness => true 
end 

quantity.rb

class Quantity < ActiveRecord::Base 
    belongs_to :ingredient 
    belongs_to :recipe 

    accepts_nested_attributes_for :ingredient, 
           :reject_if => :all_blank 

    validates :ingredient, :uniqueness => true 
end 

recipe.rb

class Recipe < ActiveRecord::Base 
    has_many :quantities, 
       dependent: :destroy 
    has_many :ingredients, 


       :through => :quantities 

     accepts_nested_attributes_for :quantities, 
             reject_if: :all_blank, 
             allow_destroy: true 

     accepts_nested_attributes_for :ingredients 
end 

görünüşüdür bölümü:

%strong Ingredients: 
    %fieldset#recipe-ingredients 
    %br 
    = f.fields_for :quantities do |builder| 
     = render 'recipe/quantity_fields', f: builder 
    .links 
     = link_to_add_association 'add ingredient', f, :quantities, 'data-association-insertion-node' => '#recipe-ingredients', 'data-assoication-insertion-moethod' => "append", :wrap_object => Proc.new{|quantity| quantity.ingredient.build ; quantity} 
      %br 

İçerik denetleyicisi:

class IngredientController < ApplicationController 
    before_action :set_ingredient, only: [:show, :edit, :update, :destroy] 

    # GET /ingredients 
    # GET /ingredients.json 
    def index 
    @ingredients = Ingredient.all 
    end 

    # GET /ingredients/1 
    # GET /ingredients/1.json 
    def show 
    end 

    # GET /ingredients/new 
    def new 
    @ingredient = Ingredient.new 
    end 

    # GET /ingredients/1/edit 
    def edit 
    end 

    def create 
    @ingredient = Ingredient.new(ingredient_params) 

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

    # PATCH/PUT /ingredients/1 
    # PATCH/PUT /ingredients/1.json 
    def update 
    respond_to do |format| 
     if @ingredient.update(ingredient_params) 
     format.html { redirect_to @ingredient, notice: 'Ingredient was successfully updated.' } 
     format.json { render :show, status: :ok, location: @ingredient } 
     else 
     format.html { render :edit } 
     format.json { render json: @ingredient.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /ingredients/1 
    # DELETE /ingredients/1.json 
    def destroy 
    @ingredient.destroy 
    respond_to do |format| 
     format.html { redirect_to ingredients_url, notice: 'Ingredient was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_ingredient 
     @ingredient = Ingredient.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def ingredient_params 
     params.require(:ingredient).permit(:name) 
    end 
end 
+0

Nasıl doğrulanmaz? Yinelenen girişler mi alıyorsunuz? –

+0

Yinelenen girişler. (Örneğin, aynı adı taşıyan öğeyi birden çok kez ekleyebilirim) – SL07

+0

Aynı durumda? İhtiyacınız olmadığından emin olun: teklik => {: case_sensitive => false}? –

cevap