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>

这里明显的问题是,如果'Before form_for'和'After 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在其中使用通常不安全。

长答案是,在幕后,模板被编译成 Ruby 方法,这些方法构建一串 HTML 代码并返回该代码。我猜测通过返回而不返回正确的代码,你会让一些事情变得混乱并丢弃form_for连接到的字符串。

于 2010-03-05T03:47:03.563 回答