id
子リソースとその親リソースの両方の子リソースの値を送信するフォームを送信していid
ます。子IDを親リソースのIDとして複製するのをやめるために、フォーム送信を取得する方法がわかりません。
テクノロジースタック:
- Rails 3.2.8
- MongoMapper
- 単純なフォーム(ただし、ラップするストックform_forでも同じ問題が発生します)
関連する抜粋routes.rb
:
namespace :mock do
resources :patients do
resources :allergies
end
end
私のモデルはとで定義されMock::Patient
てMock::Patient::Allergy
います。
Allergyリソースのビューpartial_form.html.erbには、次のオープニングフォームヘルパーの使用法があります(Simple Formを使用していますが、ストックform_forヘルパーでも同じ結果が得られます)。
<%= simple_form_for [@mock_patient, @mock_allergy], :url => mock_patient_allergy_path(@mock_allergy), do |f| %>
これがレンダリングされている間、次のルートに送信されます。
/ mock /patients/:patient_id/allergies/:id
したがって、私のallergies_controller.rbファイルは更新アクションを受け取ります(編集操作の場合)。
ただし、paramsを見ると、params [:patient_id]はparams [:id]と同じです。どちらも実際には、編集中の特定のネストされたアレルギーリソースのID値です。親リソース(この場合は患者)によって、コンテキストが失われます。
それで、私はフォームに隠しフィールドを含めることに着手しました:
<%= hidden_field_tag('patient_id', @mock_patient.id) if @mock_patient %>
フォームを送信する前にページソースを表示すると、確かに正しい patient_id
値が表示されます。
親リソースのIDを子リソースのIDに置き換える組み込みのフォーム処理ロジックがあるようです。
MongoMapperを使用した私のモデルファイルは次のとおりです。
class Mock::Patient
include MongoMapper::Document
# other Patient model keys here
many :allergies, :class => Mock::Patient::Allergy
end
class Mock::Patient::Allergy
include MongoMapper::EmbeddedDocument
# other Allergy model keys here
belongs_to :patient, :class => Mock::Patient
end
要約すると、フォームタグを調整して正しいルートに送信することはできますが、被制御者が受信したparamsハッシュがジャックアップされ、親リソースコンテキストが失われます。
私が試したフォームタグの他のバリエーションは役に立ちませんでした:
<%= simple_form_for @mock_allergy, :url => mock_patient_allergy_path(@mock_allergy), do |f| %>
と
<%= simple_form_for @mock_allergy, :html => { :class => 'form-horizontal' } do |f| %>
上記のどちらの場合も、生成された基本的なルートテンプレートは問題なく、allergies_controllerに到達しますが、検査に行くとparams[:patient_id]
、誤った値が表示されます。実際にはの複製ですparams[:id]
。
具体例
私のフォームタグライン:
<%= simple_form_for @mock_allergy, :url => mock_patient_allergy_path(@mock_patient, @mock_allergy) do |f| %>
これにより、ソースを表示したときに次のレポートが表示されるページが生成されます。
<form accept-charset="UTF-8"
action="/mock/patients/5092c815fdb5424df800000d/allergies/5092c815fdb5424df800001c"
class="simple_form form-horizontal"
id="edit_mock_patient_allergy_5092c815fdb5424df800001c" method="post"
novalidate="novalidate">
しかし、on params [:patient_id]に基づいてMock :: Patientを探しているコントローラーにヒットすると、期待する「5092c815fdb5424df800000d」の値が得られません。私のブラウザでは、エラーページに受信したパラメータが次のように表示されます。
{ "patient_id"=>"5092c815fdb5424df800001c",
"id"=>"5092c815fdb5424df800001c" }
これらの2つのIDは同一であり、そこに問題があります。
提案?