0

id子リソースとその親リソースの両方の子リソースの値を送信するフォームを送信していidます。子IDを親リソースのIDとして複製するのをやめるために、フォーム送信を取得する方法がわかりません。

テクノロジースタック:

  • Rails 3.2.8
  • MongoMapper
  • 単純なフォーム(ただし、ラップするストックform_forでも同じ問題が発生します)

関連する抜粋routes.rb

namespace :mock do 
  resources :patients do
    resources :allergies
  end
end

私のモデルはとで定義されMock::PatientMock::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は同一であり、そこに問題があります。

提案?

4

1 に答える 1

0

解決済み:

私の更新方法では、成功すると、scaffoldからのリダイレクトは次のようになりました。

redirect_to @mock_allergy

それ以外の:

redirect_to mock_patient_allergy_path(@mock_patient, @mock_allergy)

それで、私は正しく形成されたルートにパントされていましたが、偽のpatient_idを使用していました。

私の他の間違いは、アレルギーのモデリングembedded_in :patientでは、線の代わりに使用する必要があったということでしたbelongs_to :patient

派生した質問:

@mock_allergyネストされたリソースであることを知っているの、およびのインスタンスがMock::Patient::Allergy、正しいパスを含む正しいパスを生成できなかったのはなぜpatient_idですか?

于 2012-11-01T20:18:08.650 に答える