这很长,是的,我很抱歉。但我想澄清一下,因为这个问题太奇怪了。
每当用户不接受我们的服务条款 (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...
那么问题来了:为什么从部分返回会阻止表单元素标签成为文档的一部分?