私は基本的に、インタラクティブでダイナミックなフォームを持つ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に
これは...うーん、ありがとう。だから私は手動でf.object.attr4charactersを繰り返す必要はありません... – Leeder