6

私は次のようなことをする私の現在のプロジェクトについての見解を持っています(hamlで):

-@horses.each do |horse|
  = render :partial => 'main/votingbox', :locals => {:horse => horse}

_votingbox.html.hamlファイルには次のものがあります。

%div.votingbox
  %span.name= horse.name
  %div.genders
    - if horse.male
      %img{:src => 'images/male.png', :alt => 'Male'} 
    - if horse.female
      %img{:src => 'images/female.png', :alt => 'Female'}
  %div.voting_form
    = form_for(Vote.new, {:url => horse_vote_path(horse)}) do |f|
      = f.label :comment, "Your opinion"
      = f.text_field :comment
      ...
      a bunch of labels and input elements follow generated using the form helpers

これにより動作するコードが生成されますが、すべてのフォーム要素に対して同じIDを持つフォームが生成されるため、投票ボックスの部分が2回目にレンダリングされるとHTMLが無効になります。

これを修正する最初の推測は、form_forに一意の:idを指定することでしたが、これはform_forによって生成されたformタグにのみ適用され、form_forブロック内のタグには適用されません。

この問題に対する明確な解決策の1つは、form_forおよび使用するすべてのフォーム要素で独自のIDを確認し、手動で定義することです。これは私が望んでいたよりも多くの仕事です。

Railsが現在すべてのフォーム要素で一意のIDを生成する方法と同様の形式で、一意のIDを取得するためのより簡単でクリーンな方法はありますか?

4

2 に答える 2

2

質問の更新されたバージョンとはまったく関係がないため、元の回答を削除しました。

更新:保存されていないActiveRecordオブジェクトが呼び出しに渡されたことがわかったのでform_for、答えは簡単になりますform_for。生成する任意のパラメーターをオーバーライドできます。これには要素IDが含まれます。そしてfields_for、特定のレコードのコンテキストを設定します。

= form_for(Vote.new, :url => horse_vote_path(horse), :id => dom_id(horse, 'vote')) do |f|
  = f.fields_for horse, :index => horse do |fh|
    = fh.text_field :whatever
    …
于 2010-10-31T18:34:36.073 に答える
2

次のように、すべてのコンテンツの自動生成されたidおよびをオーバーライドできます。nameform_for:as

= form_for(Vote.new, :as => horse.name, {:url => horse_vote_path(horse)}) do |f|
  = f.label :comment, "Your opinion"
  = f.text_field :comment

したがって、指定されたhorse.namefoobarである場合、idfoobar_commentで名前がfoobar[comment]

ただし、動的パラメーターが HTML ID として受け入れられることを忘れないでください。like は HTML IDhorse.nameとしてhor$e受け入れられないため、何かが壊れる可能性があります。

PS:回答が遅くなり申し訳ありませんが、質問された時点では、レールについてまったく学んでいませんでした。それが誰かを助けることを願っています!

于 2013-05-18T22:24:39.397 に答える