我是一个新手的轨道试图使一个应用程序管理的集合使用Rails 3.标签的翻译我还没有得到太远过去脚手架所以据我知道我用Rails 3的默认JavaScript库(即原型,而不是jQuery)。如何让我的Rails 3表单中的JavaScript不显眼?
我有一个标签集的名称的形式,所需的行为是所有当前标签集的名称将被填充在下拉列表中("label_sets"
),并且当您选择一个时,它将填充在:name
文本字段($('label_set_name')
),并禁用它。如果下拉显示:include_blank
值,可以输入一个新的标签集名称。当提交表单时,被重新启用:name
文本字段,所以它的价值实际上将得到保存。
此表单不会执行所需的行为,但我认为必须有一种方法可以将:onsubmit
和:onchange
中的javascript重构为另一个文件并使其不显眼。我在网上搜索了关于在Rails 3中制作不引人注意的JavaScript的材料,但是老实说,它被大量的困惑所困扰,并且不知道如何将它应用到我的案例中。任何人都可以提供任何建议吗?我的标签集形式的缩写源代码如下:
# app/views/label_sets/_form.html.erb
<%= form_for(@label_set,
:html => { :onsubmit => "$('label_set_name').enable();" }) do |f| %>
# ...
<div class="field">
<%= label "label_sets", t('.label_set') %><br />
<%= select_tag("label_sets",
options_for_select(LabelSet::NAMES),
{ :include_blank => t('.new'),
:onchange => "if (this.value.empty()) {
$('label_set_name').clear();
$('label_set_name').enable();
} else {
$('label_set_name').value = this.value;
$('label_set_name').disable();
}" }) %><br />
</div>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
# ...
<% end %>
更新:所以我觉得我解决我的问题,或者至少得到了我的表单视图寻找更清洁,采取所有的JavaScript出来,并将其塞进application.js
(并在jQuery中写下它来尝试新的东西)。
新的表单视图看起来像:
# app/views/label_sets/_form.html.erb
<%= form_for(@label_set) do |f| %>
# ...
<div class="field">
<%= label "label_sets", t('.label_set') %><br />
<%= select_tag("label_sets",
options_for_select(LabelSet::NAMES),
{ :include_blank => t('.new') }) %><br />
</div>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
# ...
<% end %>
新application.js
看起来像:
# public/javascripts/application.js
$(function() {
$('.new_label_set, .edit_label_set').submit(function() {
if ($('#label_set_name').attr('disabled') == true) {
$('#label_set_name').removeAttr('disabled');
}
});
$('#label_sets').change(function() {
if ($(this).val() == '') {
$('#label_set_name').val('');
$('#label_set_name').removeAttr('disabled');
} else {
$('#label_set_name').val($(this).val());
$('#label_set_name').attr('disabled', true);
}
});
});