頻度と期間という 2 つの選択オプションを含むフォームがあります。フォームにエラーがあり、ブラウザーに返された場合、それらのフィールドに返された値が選択のオプションの値と一致していても、ユーザーが行った選択が選択オプションに再入力されません。また、フォームが返されたときに、値が空白であっても、これらのフィールドはエラーとしてマークされません。
Rails の頻度フィールドと期間フィールドは次のとおりです。
<%= frequency_select c, :frequency %>
<%= duration_select c, :duration %>
frequency_select のメソッドは次のとおりです。
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 ここでもう 1 つ重要な情報がありますが、私のテストでは、おそらくそうではないことが示されています。(ただし、私はこれに少し慣れていないので、私の言葉を鵜呑みにしないでください。)
これら 2 つのフィールドは、カスケード jquery プラグインを使用して連結されます。
javascript はページに含まれており (別のファイルではありません)、js の一部は Rails によって作成されています。
まず、ブラウザに表示されるスクリプトを次に示します。1 つ目は期間選択のオプションを生成するスクリプトで、2 つ目はカスケード プラグインがフィールド チェーンをトリガーするために必要なスクリプトです。
<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によって生成されていません