저는 Ruby on Rails를 처음 사용하고 바로 레일 4에서 시작되었습니다.레일 4, 이중 중첩 모델 및 강력한 매개 변수
레시피와 성분 모델을 성공적으로 중첩하여 동일한 형식으로 추가 할 수 있습니다. 다음으로 나는 같은 재료 안에 수량을 추가 할 수 있도록 성분 내에 수량을 중첩시키고 싶습니다. 모든 것이 잘 될 때까지 성분의 양이 데이터베이스에 삽입 될 때까지 그리고 나는 이것으로부터 recipes_controller의 강력한 매개 변수에 문제가 있다고 생각합니다. 하지만 아래에 전체 코드를 게시 할 것입니다. 양식에 simple_form을 사용하고 있습니다.
도움 주시면 감사하겠습니다. 여기
class RecipesController < ApplicationController
def new
@recipe = Recipe.new
3.times do
ingredient = @recipe.ingredients.build
1.times {ingredient.quantities.build }
end
end
def create
@recipe = Recipe.new(params[:recipe].permit(:title, :desc, ingredients_attributes: [:id, :recipe_id, :name, :_destroy, quantities_attributes: [:id, :ingredient_id, :amount, :unit, :_destroy]]))
if @recipe.save
redirect_to @recipe
else
render "new"
end
end
def show
@recipe = Recipe.find(params[:id])
end
def edit
@recipe = Recipe.find(params[:id])
end
def update
@recipe = Recipe.find(params[:id])
if @recipe.update(params[:recipe].permit(:title, :desc))
redirect_to @recipe
else
render 'edit'
end
end
def destroy
@recipe = Recipe.find(params[:id])
@recipe.destroy
redirect_to recipes_path
end
def index
@recipes = Recipe.all
end
private
def post_params
params.require(:recipe).permit(:title, :desc, ingredients_attributes: [:id, :recipe_id, :name, :_destroy, quantities_attributes: [:id, :ingredient_id, :amount, :unit, :_destroy]])
end
end
는 그때 파셜 통해 레시피 성분 및 양에 대한 형태를 만드는 간단한 형태를 사용 recipes_controller이다
class Recipe < ActiveRecord::Base
has_many :comments, dependent: :destroy
has_many :ingredients, dependent: :destroy
accepts_nested_attributes_for :ingredients, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true
validates :title, presence: true
validates :desc, presence: true
end
class Ingredient < ActiveRecord::Base
belongs_to :recipe
has_many :quantities, dependent: :destroy
accepts_nested_attributes_for :quantities, :reject_if => lambda { |a| a[:name].blank? }, :allow_destroy => true
end
class Quantity < ActiveRecord::Base
belongs_to :ingredient
end
: 여기
내 모델이다._form :
_ingredients_fields에서 렌더링<%= simple_form_for @recipe do |f| %>
<%= f.error_notification %>
<%= f.input :title %>
<%= f.input :desc %>
<%= f.simple_fields_for :ingredients do |builder| %>
<%= render "ingredient_fields", :f => builder %>
<% end %>
<p class="links">
<%= link_to_add_association 'add ingredient', f, :ingredients %>
<p class="links">
<%= f.error :base%>
<%= f.submit %>
<% end %>
:
_quantities_fields에서 렌더링<div class="nested-fields">
<%= f.input :name, label: "Ingredient" %>
<%= f.simple_fields_for :quantities do |builder| %>
<%= render "quantities_fields", :f => builder %>
<% end %>
<%= link_to_remove_association "remove", f %>
</div>
: [EDITED]
<div class="nested-fields">
<%= f.input :amount %>
<%= f.input :unit %>
</div>
새로운 레시피를 추가하는 시도가 발생할 다음 로그 진술 :
Started POST "/recipes" for 127.0.0.1 at 2013-10-29 14:15:40 +0100
Processing by RecipesController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"t6LKgDLwAxaU9xo2ipyCM+j1yfVF9WrI8AoGTX+gRkw=", "recipe"=>{"title"=>"Pancakes", "desc"=>"Tasty", "ingredients_attributes"=>{"0"=>{"name"=>"Milk", "quantities_attributes"=>{"0"=>{"amount"=>"1", "unit"=>"Cup"}}, "_destroy"=>"false"}}}, "commit"=>"Create Recipe"}
[1m[35m (0.1ms)[0m begin transaction
[1m[36mSQL (3.5ms)[0m [1mINSERT INTO "recipes" ("created_at", "desc", "title", "updated_at") VALUES (?, ?, ?, ?)[0m [["created_at", Tue, 29 Oct 2013 13:15:40 UTC +00:00], ["desc", "Tasty"], ["title", "Pancakes"], ["updated_at", Tue, 29 Oct 2013 13:15:40 UTC +00:00]]
[1m[35mSQL (0.4ms)[0m INSERT INTO "ingredients" ("created_at", "name", "recipe_id", "updated_at") VALUES (?, ?, ?, ?) [["created_at", Tue, 29 Oct 2013 13:15:40 UTC +00:00], ["name", "Milk"], ["recipe_id", 27], ["updated_at", Tue, 29 Oct 2013 13:15:40 UTC +00:00]]
[1m[36m (7.8ms)[0m [1mcommit transaction[0m
Redirected to http://www.projectcookbook.dev/recipes/27
Completed 302 Found in 22ms (ActiveRecord: 11.7ms)
아마도 [폼 객체 패턴 (https를해야한다. thoughtbot.com/activemodel-form-objects)는 복잡한 ActiveRecord 중첩 속성 문제를 해결하는 좋은 방법입니다. – shvetsovdm