내 컨트롤러가 배열 매개 변수를 올바르게 저장하지 않습니다.
데이터 베이스
|categories|
|id| |name|
1 HW
2 SF
3 PC
|products|
|id| |amount| |category_id|
그러나 테이블을 저장 한 후 배열 PARAMS을 저장해야합니다 '제품'은 다음과 같이 될 것입니다 데모
|products|
|id| |amount| |category_id|
1 100 1
2 200 2
3 300 3
제어 장치:
def new
@categories = Category.all
@obj_product = Product.new(params[:obj_product])
end
def create
params[:obj_product].each do |key , value|
o = FlowBudgetDetail.new( :amount => value , :category_id => key)
o.save
end
if o.save()
redirect_to :action=>"index"
else
redirect_to :action=>"new"
end
end
전망:
<% form_for :obj_product, :url => {:action=>'create'} do |f| %>
<% @categories.each do |category| %>
<%= f.text_field :category_id , :name => "obj_product[array_#{category.id}][category_id]"%>
<%= f.text_field :amount , :name => "obj_product[array_#{category.id}][amount]" %>
<% end %>
<$ end %>
로그에 모든 매개 변수가 표시되지만 하나의 삽입 만 생성됩니다.
Processing ProductController#create (for 127.0.0.1 at 2015-08-07 17:23:26) [POST]
Parameters: {"commit"=>"Save", "obj_product"=> {"array_1"=>{"amount"=>"100","category_id"=>"1"},"array_2"=>{"amount"=>"300","category_id"=>"2"},"array_3"=>{"amount"=>"300","category_id"=>"3"} }}
INSERT INTO `products` (`category_id`, `amount`) VALUES( 0, 1)
INSERT INTO `products` (`category_id`, `amount`) VALUES( 0, 1)
INSERT INTO `products` (`category_id`, `amount`) VALUES( 0, 1)
이것은 이것을 저장해야합니다 :
INSERT INTO `products` (`category_id`, `amount`) VALUES( 1, 100)
INSERT INTO `products` (`category_id`, `amount`) VALUES( 2, 200)
INSERT INTO `products` (`category_id`, `amount`) VALUES( 3, 300)
잘못된 정보를 저장 (잘못된 매개 변수)
누군가 나를 도울 수 있습니까?
한 번에 여러 레코드를 만들려고하지만 한 번의 호출을 사용하여 만들려고하는 new
것이 중요합니다 !!! 당신의 Controller#new
행동에서 당신은 하나의 객체에 대해서만 DB를 요청합니다. @categories
필요한 수의 루프를 수행 하기 위해 사용하기 때문에 필요한 양식 필드를 얻는 것이 좋습니다 . 하지만 당신의 Controller#create
행동에서 당신은 :
obj_product.new(params[:obj_product])
시도해 볼 수 있습니다.
obj_product.create(params[:obj_product])
그러나 이것은 매개 변수가 다음과 같기 때문에 작동하지 않습니다.
"flow_budget_detail"=> {"1"=>{"amount"=>"100"},"2"=>{"amount"=>"300"},,"2"=>{"amount"=>"300"} }
이 Controller#new
작업을 수행 하려면 작업을 수행 하기 전에 모든 @obj_products를 만들어야합니다 . 이렇게하면 3 개의 카테고리가 연결되어있는 경우 3 개의 Product 객체를 양식에 전달하면 매우 다른 매개 변수 해시가 반환됩니다. params 해시는 다음과 같아야합니다.
[{"category_id" => "1", "amount"=>"100"},{"category_id" => "2", "amount"=>"200",...}]
그러나 컨트롤러와 양식을 다시 작성하지 않으면 작동하지 않습니다. 다음과 같이 할 수 있습니다.
def create
if FlowBudgetDetail.transaction do
params["flow_budget_details"].each do |k,v|
new_record = FlowBudgetDetail.new("category_id" => k, "amount" => v)
new_record.save
end
end
redirect_to :action=>"index"
else
redirect_to :action=>"new"
end
end
좋아요, 이것은 그대로 작동합니다. params["flow_budget_details"].each
잘못된 결과를 얻는 이유 중 하나이기 때문에 키를 변경하지 마십시오 . 또한`.new ( "category_id"=> k, "amount"=> v) '의 순서를 변경하지 마십시오. 지난 시간에 제가 말한 것에서 거꾸로 만들었고 결과도 망 쳤기 때문입니다.
정확히이 작업을 수행하고 결과를 게시하십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다