2016-09-13 22 views
0

私は基本的に、インタラクティブでダイナミックなフォームを持つRPGのキャラクター作成者であるアプリケーションを作成します。 Rails 5.0.0.1を使用していて、フォームを正しく更新できません。ベースモデルは正常に更新されますが、ネストされたモデルはすべて更新されません。Railsはネストされた属性を更新しません

だから、私は

class Character < ApplicationRecord 
    has_many :attr4characters, autosave: true 
    accepts_nested_attributes_for :attr4characters, allow_destroy: true 
end 

と文字と彼の属性のセットを表す

class Attr4character < ApplicationRecord 
    belongs_to :character 
end 

を持っています。 Attr4characterの各レコードは異なる属性です。

表示するビューは単純です:

... 
<div class="field"> 
    <%= f.label :description %> 
    <%= f.text_area :description %> 
</div> 

<div class="field"> 
    <%= f.label :character_type %> 
    <%= f.select(:character_type, options_for_select(["Zhong Lung", "Shih", "Hsien", "Garou", "Technocrat"])) %> 
</div> 

    <% f.object.attr4characters.each do |attr| %> 
    <%= f.fields_for attr do |attr_f| %> 
     <div class="field"> 
     <%= attr_f.label "Field name" %> 
     <%= attr_f.text_field :field_name %> 
     </div> 
     <div class="field"> 
     <%= attr_f.label "Field value" %> 
     <%= attr_f.text_field :field_value %> 
     </div> 
    <% end %> 
    <% end %> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
... 

そして最後に、私のcharacters_controller:

def update 
    respond_to do |format| 
     if @character.update(character_params) 
     format.html { redirect_to @character, notice: 'Character was successfully updated.' } 
     format.json { render :show, status: :ok, location: @character } 
     else 
     format.html { render :edit } 
     format.json { render json: @character.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    private 
    def set_character 
     @character = Character.find(params[:id]) 
    end 

    def character_params 
     params.require(:character).permit(:id, :name, :player, :description, :character_type, attr4characters_attributes: [:id, :character_id, :field_name, :field_value]) 
    end 

だから、私が正しく文字と彼の属性のすべての設定を表示するフォームを、持っています。文字フィールドを更新すると(説明のように)、通常更新されます。ネストされたフィールドを更新すると、Railsは文字が正常に更新され、何も変更されないことを示します。私はGoogleを使って検索しましたが、Railsフォームのネストされた属性には多くの問題がありましたが、私のために働いたレシピはありませんでした。私はそれがRails 4のバグであるという意見にも遭遇しましたが、私は5番目のバージョンを使用します...

トピックに関するアドバイスをしてください。本当にバグですか?または私は何か間違っているのですか?私はRailsの新機能ですから、その可能性を排除するものではありません。 :)

ちなみに、サーバーのログには、attr4charactersに関する警告があることがわかりました。

Processing by CharactersController#update as HTML 
    Parameters: {"utf8"=>"\u2713", "authenticity_token"=>"xeYyIRc13YiOk29v18rFM6Oh5OHRRuPpSKEQuIHE/U4uhANEF7TwMp8mb6hv6L7mUAm5MngAuyFayHcWV/Vvbw==", "character"=>{"name"=>"Ray", "player"=>"111", "description"=>"A Zhong Lung suicider", "character_type"=>"Hsien", "attr4character"=>{"field_name"=>"Gift1", "field_value"=>"Sense Wyrm"}}, "commit"=>"Update Character", "id"=>"3"} 
    Character Load (0.2ms) SELECT "characters".* FROM "characters" WHERE "characters"."id" = ? LIMIT ? [["id", 3], ["LIMIT", 1]] 
Unpermitted parameter: attr4character 
    (0.1ms) begin transaction 
    SQL (0.9ms) UPDATE "characters" SET "character_type" = ?, "updated_at" = ? WHERE "characters"."id" = ? [["character_type", "Hsien"], ["updated_at", 2016-09-13 14:39:10 UTC], ["id", 3]] 
    (24.3ms) commit transaction 

しかしattr4charactersは警告が、それはすべてのattr4characterの属性を無視していることを語っている... characters_controllerに

答えて

1

を許可されています。 permitコードはお使いのモデルと同じですが、ビューが一致しません。あなたはすべきである。

f.fields_for :attr4characters do |attr_f| 
    ... 
end 

そして、レールが関連付けを反復処理するようにする。これにより、属性の名前が正しく指定されます(ホワイトリストによって許可されるようになります)。

+0

これは...うーん、ありがとう。だから私は手動でf.object.attr4charactersを繰り返す必要はありません... – Leeder

関連する問題