0

테이블 조인레일 5 : 업데이트 속성에서이 많은 통해 내가 현재 인터넷 쇼핑몰에서 일하고 있어요 내가 레일 5. 나는 다음과 같은 모델과 관계 한 사용하고

# Products 
class Product < ApplicationRecord 
    has_many :product_variants 
    has_many :variants, through: :product_variants 
    ... 

class Variant < ApplicationRecord 
    has_many :product_variants 
    has_many :products, through: :product_variants 
    ... 

# My join table between Product and Variant 
class ProductVariant < ApplicationRecord 
    belongs_to :price, optional: true 
    belongs_to :product, optional: true 
    belongs_to :variant, optional: true 

ProductVariant 모델은이를 내가 업데이트 할 수있는 추가 속성 인 t.integer "quantity". form_for에서이 속성을 업데이트 할 때 약간 손실됩니다.

= form_for @product, html: { method: :patch } do |product_builder| 

    = product_builder.fields_for :product_variants, product_variant do |variant_builder| 

    = variant_builder.hidden_field :variant_id, value: product_variant.variant.id 

    = variant_builder.number_field :quantity 

    = variant_builder.submit 

를하지만 제대로 작동하지 않습니다 : 폼

나의 현재 솔루션은 (내가 HAML 사용) 다음과 같습니다. 필자의 조인 테이블에 ID 열이 있으면 쉽게 느껴졌 겠지만 데이터베이스에 중복 된 것으로 생각됩니다. 제출 버튼을 클릭하면 현재 ProductVariant의 또 다른 인스턴스가 생성 된 것으로 보입니다.

내 연결 테이블에서 내 quantity 특성을 올바르게 업데이트하기 위해 필요한 사항은 무엇입니까? 완료

를 들어

이 내가 제출을 클릭하면 로그인됩니다 것입니다 : 당신은 has_many :though을하고있는

Parameters: {"utf8"=>"✓", "authenticity_token"=>"uisxjfvj9LxZVJWcDVos66tJWNfHkld5+/gdfGv1D2WZsrLJcH7KLxb5eSDAYIL23mEEho18Pv/53bSEP8cC9A==", "product"=>{"product_variants_attributes"=>{"0"=>{"variant_id"=>"1", "product_id"=>"11", "quantity"=>"20", "id"=>""}}}, "commit"=>"Update Product variant", "id"=>"11"} Product Load (0.1ms) SELECT "products".* FROM "products" WHERE "products"."id" = ? LIMIT ? [["id", 11], ["LIMIT", 1]] Unpermitted parameter: :id (0.1ms) begin transaction Brand Load (0.2ms) SELECT "brands".* FROM "brands" WHERE "brands"."id" = ? LIMIT ? [["id", 4], ["LIMIT", 1]] Variant Load (0.2ms) SELECT "variants".* FROM "variants" WHERE "variants"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] Brand Exists (0.2ms) SELECT 1 AS one FROM "brands" WHERE "brands"."name" = ? AND ("brands"."id" != ?) LIMIT ? [["name", "Fredric Malle"], ["id", 4], ["LIMIT", 1]] SQL (0.4ms) INSERT INTO "product_variants" ("variant_id", "product_id", "quantity") VALUES (?, ?, ?) [["variant_id", 1], ["product_id", 11], ["quantity", 20]] (2.7ms) commit transaction (0.2ms) SELECT COUNT(*) FROM "note_parts" INNER JOIN "product_note_parts" ON "note_parts"."id" = "product_note_parts"."note_part_id" WHERE "product_note_parts"."product_id" = ? [["product_id", 11]] Redirected to http://localhost:3000/products/11/edit Completed 302 Found in 15ms (ActiveRecord: 4.0ms)

+0

'Unpermitted parameter : : id'를 보내고 있습니다. 강력한 매개 변수가 아닌'id' 속성이 있습니다. –

+0

Thanks @ SebastiánPalma, 네, 저것을 보았습니다. 나는 그것이 조인 테이블이고 id 컬럼이 존재하지 않기 때문에 실제로 id를 보내고 싶지 않다. 내 강력한 매개 변수에'id'를 추가하면 다음과 같은 오류가 발생합니다.'NoMethodError (unilited 메소드'to_sym 'for nil : NilClass) :'. 그래서 나는 더 큰 문제가 있다고 생각합니다. :( – Anders

답변

1

. 이 경우 조인 테이블에 기본 키 (일반적으로 : id)가 있어야합니다. 그렇지 않으면 여기에서 원하는 것과 같이 직접 조인 테이블에 액세스 할 수 없습니다.

반면에 조인 테이블에 직접 액세스 할 필요가 없다면 (예 : 추가 열이없는 경우) 조인 테이블에 대한 id 열이없는 has_and_belongs_to_many를 설정할 수 있습니다.

+0

감사합니다. 테이블의 기본 키를 추가했는데 이제는 작동합니다. – Anders