1

これは長いです、はい、私はお詫び申し上げます。しかし、この問題はとても奇妙なので、はっきりさせておきたいと思います。

ユーザーが利用規約(TOS)に同意しなかった場合に表示される利用規約モーダルがあります。ここでの目的のために、javascriptはオフにされ、レンダリングされるのは厳密にhtml/cssです。したがって、ページは、3層で考えると、次のようになります。下層=彼らが見に来たページ(つまり、イベントページ)、中間層:半透明のオーバーレイ、上(一次/可視)層:用語を含むモーダルその中のサービス契約書の。このフォームは、単にチェックボックスと送信ボタンを受け入れるだけです。

TOSが正しく機能していないことに気づきましたが、一見ランダムな時間でした。それから私はそれが壊れていることに気づきましたが、同じパーシャルがサイトのどこに表示されても利用規約を表示する責任があるにもかかわらず、私のイベントページ(/ event / foo)でのみです。したがって、/ group / barのような他のページでは、同じTOSモーダルが表示され、正常に機能します。

次に、問題はフォームタグがHTMLにないことであることに気付きました。行ったばかりです。

したがって、一歩後退すると、問題の(HAML)コードは単純に次のようになります。

%div#accept_tosC
  %b Before form_for
  - form_for @current_user do |form|
    %b After form_for
    %div#tosC= render :partial => 'general/terms'

    %div.left
      = render :partial => 'shared/user/tos_form_element'
    %div.right
      = image_submit_tag "/images/buttons/submit_100x20.png", :id => 'submit', :name => 'submit'

/ events / fooページの場合、生成されるHTMLは次のようになります。

<div id="accept_tosC">
   <b>before form_for</b>
  <div style="margin: 0pt; padding: 0pt;"><input type="hidden" value="put" name="_method"><input type="hidden" value="44c2bf7a64fc59baa3fc7129167f0e2c3e96abb6" name="authenticity_token"></div>
      <b>after form_for</b>

ここでの明らかな質問は、「form_forの前」と「form_forの後」がドキュメントに組み込まれる場合、フォームタグform_forが作成しないのはなぜですか?

別のページ、たとえば/ groups / fooの場合、期待どおりの結果が得られます。

<div id="accept_tosC">
  <b>before form_for</b>
  <form method="post" id="edit_user_595" class="edit_user" action="/users/595"><div style="margin: 0pt; padding: 0pt;"><input type="hidden" value="put" name="_method"><input type="hidden" value="44c2bf7a64fc59baa3fc7129167f0e2c3e96abb6" name="authenticity_token"></div>
    <b>after form_for</b>

私はそれを「最下層」のコード内の単一の部分的なウェルまで追跡しました(TOSオーバーレイではなく、彼らが要求したページ)。問題のこの部分は、特定の個人に表示される場合と表示されない場合があるため、ユーザーがこのページを表示できるかどうかを確認する必要があります。その結果は、変数can_viewに保持されます。

:ruby
  #some processing to set page info and can_view
  return unless can_view

%div#statsC
  ...and so on...

これは私のコードがどのように見えたかであり、フォームタグはレンダリングされませんでした。次の変更を行うことにより、フォーム要素タグがすべてのページで期待どおりに表示されました。

:ruby
  #some processing to set page info and can_view

- if can_view
  %div#statsC
    ...and so on...

だからここに質問があります:部分から戻ると、フォーム要素タグがドキュメントの一部になるのを防ぐのはなぜですか?

4

1 に答える 1

2

簡単に言うと、テンプレートは不思議な方法で機能し、一般的にテンプレートreturn内で使用するのは安全ではありません。

長い答えは、舞台裏では、テンプレートがHTMLコードの文字列を構築してそのコードを返すRubyメソッドにコンパイルされるということです。適切なコードを返さに戻ることで、何かを混乱させ、form_for連結している文字列を破棄していると思います。

于 2010-03-05T03:47:03.563 に答える