2016-08-17 9 views
0

これがsimple_fields_forの問題か繭の問題なのかどうかはわかりませんでした。 </div>プレースメントで慌ててしまった場合は表示されません。検証が失敗したときに1つのフォーム要素がレンダリングされない

フォームが最初に表示されると、プロトコル名の入力フィールドがレンダリングされます。ユーザはボタンをクリックして、関心のあるフォーム要素を追加することができる。これは正常に動作し、次のようになります。

enter image description here

ユーザーが追加することができます。

enter image description here

はここで、ユーザが「要素を追加」ボタンのそれぞれをクリックした後、それがどのように見えるかです0.各要素のいくつか。彼らが「保存」をクリックすると、すべてがうまく機能します。

いずれかのフィールドに検証エラーがある場合、フォームは1つの例外を除いて正常に再描画されます。 「イメージングステップ」要素の検証エラーはまったく表示されません。他の要素は再レンダリングされ、検証が失敗した場合には期待どおりに強調表示されます。

ここに図があります。フォームの再、「保存」をクリックし、検証を失敗した後

enter image description here

:ユーザーは、「シーケンス」を選択するのを忘れたと「ヒントの説明」のテキストを入力するのを忘れた、フォームの一部を記入しますこのような-renders:あなたが見ることができるように

enter image description here

、イメージングステップセクションが再描画されていません。

ビューのコンテキストでparamsを見ると、すべてがそこにあるようです。 @ protocol.errorsは私にも同様に見えます。モデルもOKです。

ここにはpastebin of the form codeがあります。

ここにはpastebin of _step_item_fields.html.erbがあります。

ここにはpastebin of _tip_fields.html.erbがあります。

ここにはpastebin of my Gemfileがあります。

UPDATE:

私はこのようなstep_item構築する場合:

<div id="step_items"> 
    <%= f.simple_fields_for :step_items, @protocol.step_items.build do |si| %> 
     <%= render 'step_item_fields', :f => si %> 
    <%end%> 
</div> 

を結像ステップの部分は常に描かれているが、(明らかに)検証が失敗したときに移入されません。これはまた、ユーザーに0.Many Imaging Stepsを追加/削除させるという機能を混乱させる。

<div id="step_items"> 
    <%= f.simple_fields_for :step_items, @protocol.step_items.build(protocol_params) do |si| %> 
     <%= render 'step_item_fields', :f => si %> 
    <%end%> 
</div> 

を...とprotocol_paramsが利用可能な他の変形が、禁断のparamsの問題に走った:

私も試してみました。

アップデート2:

私もstep_itemのためのparamsとハッシュを構築しようとしました。私はここでこれを使うことができます:

<div id="step_items"> 
    <%= f.simple_fields_for :step_items, @protocol.step_items.build(some_ok_params) do |si| %> 
     <%= render 'step_item_fields', :f => si %> 
    <%end%> 
</div> 

...ただし、1つのstep_itemだけです。 0..manyの機能を反映したハッシュのハッシュを渡す方法がわかりません。また、このようにstep_itemを作成すると、フォーム要素が正しく入力されますが、エラーのハイライトスタイルは含まれません。これは、私がなぜ簡単な解決法が機能していないのか不思議に思っていた頃です。

答えて

0

StepItemはSTIクラスStepのサブタイプなので、StepItemsのエラー検出が失敗していると思います。ここの私のハックはかなり脆弱ではありません。あなたが持っているなら、より良い方法を投稿してください。

私は_form.html.erbでこれを変更:

...

<%if params["protocol"] && params["protocol"]["step_items_attributes"].present?%> 
    <%params["protocol"]["step_items_attributes"].each do |sia|%> 
     <%v = sia[1]%> 
     <div id="step_items"> 
      <%= f.simple_fields_for :step_items, @protocol.step_items.build(:orientation_id => v["orientation_id"], :sequence_id => v["sequence_id"], :note => v["note"], :id => v["id"], :protocol_id => v["protocol_id"], :institution_id => v["institution_id"]) do |si| %> 
       <%= render 'step_item_fields', :f => si%> 
      <% end %> 
     </div><!-- end step_items--> 
    <%end%> 
<%else%> 

を...

私は_step_item_fields.html.erbでこれを変更:

。 ..

<div class="nested-fields"> 
    <div class= "form-inputs"> 
     <div class="row"> 
      <div class="col-sm-2 text-right">Imaging Step:</div> 
       <div class="col-sm-2 drop_col ">     
        <%= f.collection_select :orientation_id, Orientation.where("institution_id=?",current_user.current_institution_id),:id,:name, {:prompt => "Pick an Orientation", }, {class: "form-control #{"dropdown_error" if f.object.orientation_id.blank? && (f.object.sequence_id.present? || f.object.note.present?)}"}%> 
       </div>    
       <div class="col-sm-2 drop_col "> 
        <%= f.collection_select :sequence_id, Sequence.where("institution_id=?",current_user.current_institution_id),:id,:name, {:prompt => "Pick a Sequence"}, {class: "form-control #{ "dropdown_error" if f.object.sequence_id.blank? && (f.object.orientation_id.present? || f.object.note.present?) }"}%>        
       </div>    
     </div> 

     <div class="row"> 
      <div class="col-sm-2"></div> 
       <%= f.input :note, :wrapper_html =>{:class => 'col-sm-8'}, label: false, placeholder: 'You can put an optional note here.' , :input_html => {:size => 50}%> 
       <%= f.input :institution_id,:as => :hidden, :input_html => {:value=>current_user.current_institution_id} %> 
       <%= f.input :id,:as => :hidden %> 
      <div class="col-sm-2"> 
       <%= link_to_remove_association "Remove Imaging Step", f , :class=>"btn btn-danger btn-xs placemid",title: "Click here to delete this imaging step.", data: {toggle: "tooltip", placement: "auto", animation: true, delay: {show: 700, hide: 100}}%> 
      </div> 
     </div> 
    </div> 
    <div class="col-sm-12"><hr></div> 
</div> 

...

そして、私は正しいスタイルシートにこれを追加しました:

.dropdown_error{ 
    color: red; 
} 

ここに見られるようにフォームが正しくStepItemエラーが表示されます。
enter image description here

関連する問題