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
Nasıl doğrulanmaz? Yinelenen girişler mi alıyorsunuz? –
Yinelenen girişler. (Örneğin, aynı adı taşıyan öğeyi birden çok kez ekleyebilirim) – SL07
Aynı durumda? İhtiyacınız olmadığından emin olun: teklik => {: case_sensitive => false}? –