我有一个表格,里面有 2 个选择选项——频率和持续时间。当表单出现错误并将其返回给浏览器时,即使这些字段的返回值与选择中的选项值匹配,也不会使用用户所做的选择重新填充选择选项。此外,当返回表单时,即使它们的值为空白,这些字段也不会被标记为有错误。
这是 Rails 中的频率和持续时间字段
<%= frequency_select c, :frequency %>
<%= duration_select c, :duration %>
频率选择的方法是
def frequency_select(f, method)
options = [["day", 1.day], ["other day", 2.days], ["week", 1.week]]
f.select method, options, :include_blank => true
end
而 duration_select 的方法是
def duration_select(f, method, unit="day" )
values, units = *case unit
when "day" : [[[5, 5], [15, 15], [30, 29]], "days"]
when "other day" : [[[15, 15], [30, 29], [45,45]], "days"]
when "week" : [[[4, 29], [6, 43], [8, 57]], "weeks"]
end
f.select method, values.map {|(label, i)| ["#{label} #{units}", i.days]}, :include_blank => true
end
如果您在这些字段中的一个或两个字段中输入值并提交表单而未完成部分(其中的任何部分),则表单将返回给用户(如预期的那样),但持续时间和频率字段不会重新填充用户的选择。
如果我将这段代码添加到表单中
<p><%= @challenge.attributes.inspect %></p>
当表单返回到浏览器时,我看到了持续时间和频率:
"duration"=>3888000, "frequency"=>172800
这些值与选择字段中的选项值匹配。
Rails 中是否有什么特别需要做的事情,以便用用户的选择重新填充选择字段?关于问题可能是什么或我接下来应该尝试什么的任何想法?
非常感谢您的帮助!
-瑞克
PS如果您查看其他一些问题,您会注意到我过去曾问过这个问题。有一次,我认为表单以天而不是秒为单位返回频率和持续时间的值,但事实并非如此。
PPS 这里还有一点可能很重要的信息,但我的测试表明它可能并不重要。(虽然,我对此有点新手,所以不要相信我的话。)
这两个字段使用 cascade jquery 插件链接在一起。
javascript 包含在页面中(不是在单独的文件中),并且一些 js 是由 Rails 创建的。
首先,这里是出现在浏览器中的脚本。第一个是为持续时间选择生成选项的脚本,第二个是 Cascade 插件触发字段链接所需的脚本。
<script type="text/javascript">
var list1 = [
{'When':'86400','Value':' ','Text':' '},
{'When':'172800','Value':' ','Text':' '},
{'When':'604800','Value':' ','Text':' '},
{'When':'86400','Value':'432000','Text':'5 days'},
{'When':'86400','Value':'1296000','Text':'15 days'},
{'When':'86400','Value':'2505600','Text':'30 days'},
{'When':'172800','Value':'1296000','Text':'15 days'},
{'When':'172800','Value':'2505600','Text':'30 days'},
{'When':'172800','Value':'3888000','Text':'45 days'},
{'When':'604800','Value':'2505600','Text':'4 weeks'},
{'When':'604800','Value':'3715200','Text':'6 weeks'},
{'When':'604800','Value':'4924800','Text':'8 weeks'}
];
function commonTemplate(item) {
return "<option value='" + item.Value + "'>" + item.Text + "</option>";
};
function commonMatch(selectedValue) {
return this.When == selectedValue;
};
</script>
<script type="text/javascript">
jQuery(document).ready(function(){
jQuery("#challenge_duration, #user_challenge_duration").cascade("#challenge_frequency, #user_challenge_frequency",{
list: list1,
template: commonTemplate,
match: commonMatch
})
});
</script>
这是 erb 文件中的第一个脚本的一些内容——您会看到其中一些脚本是由 Rails 生成的
<%=
[ [1.day, [[5, 5], [15,15], [30, 29]], "days"],
[2.days, [[15, 15], [30, 29], [45, 45]], "days"],
[1.week, [[4, 29], [6, 43], [8, 57]], "weeks"]].map do |(frequency, durations, unit)|
durations.map do |(label, value)|
"{'When':'#{frequency}','Value':'#{value.days}','Text':'#{label} #{unit}'}"
end
end.join(",\n")
-%>
现在,我认为是否使用 JS 生成持续时间并不重要的原因是
- 如果我删除所有 JS,问题仍然存在
- 该问题还影响频率场,其选项不是由 JS 生成的