我尝试在提交表单之前将表单中两个选择字段的值组合成一个变量。
以下是我的代码:
在new.html.erb(对于RoR):
<%= form_for :character, url: characters_path, method: :post do |f| %>
<p>
<%= f.label :alignment %><br>
<%= f.select :alignment_lr, options_for_select([" ","Chaotic","Neutral","Lawful"], disabled: " ", selected: " ") %>
<%= f.select :alignment_ud, options_for_select([" ","Good","Neutral","Evil"], disabled: " ", selected: " ") %>
</p>
<% end %>
这会生成以下html:
<p>
<label for="character_alignment">Alignment</label><br>
<select id="character_alignment_lr" name="character[alignment_lr]">
<option disabled="disabled" selected="selected" value=" "> </option>
<option value="Chaotic">Chaotic</option>
<option value="Neutral">Neutral</option>
<option value="Lawful">Lawful</option></select>
<select id="character_alignment_ud" name="character[alignment_ud]">
<option disabled="disabled" selected="selected" value=" "> </option>
<option value="Good">Good</option>
<option value="Neutral">Neutral</option>
<option value="Evil">Evil</option></select>
</p>
如何将为:alignment_lr
和:alignment_ud
选择的值组合为alignment.value = alignment_lr.value + ' ' + alignment_ud.value
之类的内容?
我愿意使用javascript或jquery来解决此问题。
答案 0 :(得分:1)
我认为最好添加一个隐藏的输入来存储这两个值;
<input id="character_alignment" type="hidden" name="character[alignment]" value=""/>
<script type="text/javascript">
$(document).ready(function() {
// for the first select
$("#character_alignment_lr").change(function(){
setCharacterAlignment();
});
// for the second select
$("#character_alignment_lr").change(function(){
setCharacterAlignment();
});
});
function setCharacterAlignment()
{
// get dropdown selected option
var val1 = $('#character_alignment_lr option:selected').val();
var val2 = $('#character_alignment_ud option:selected').val();
// set hidden input value
$("#character_alignment").val(val1 + " " + val2);
}
</script>
答案 1 :(得分:0)
您可以通过以下几种方式实现这一目标:
在create方法的控制器中,您可以输入:
alignment.value = params[:character][:alignment_lr] + ' ' + params[:character][:alignment_ud]
或
@character = Character.new(character_params)
@character.alignment = @character.alignment_lr + " " + @character.alignment_ud
如果您想使用javascript,可以使用隐藏字段来连接两个字段,如@Ceparu Stefan所示
答案 2 :(得分:0)
实际上根本不需要使用脚本。您似乎没有真正关心将对齐变量的组件保留为模型中的单独字段,因此简短的答案是:不要这样做。
您可以使用虚拟属性在表单中记录值,然后在模型中应用逻辑以创建通过ActiveRecord保存到数据库的实际值。虚拟属性允许您的表单包含与模型中的字段不直接对应的字段。
创建一个删除&#34; alignment_lr
&#34;和&#34; alignment_ud
&#34;列并用一列&#34;对齐替换它们。&#34;理想情况下,您可以将数据库规范化,使每个对齐组合保存到路由表中,并且您要保存密钥,而不是动态生成的字符串,但这是一个不同的问题;
在Character.rb
模型中,添加attr_accessor
行:
class Character < ActiveRecord::Base
attr_accessor: :alignment_lr, :alignment_ud
在您的characters_controller.rb
文件中,将:alignment_lr
和:alignment_ud
添加到您的强参数(character_params
方法)
您仍然可以完全按照已有的f.select
语句撰写。
使用characters_controller.rb
create
方法:
@character.combine_alignment(@character.alignment_lr, @character.alignment_ud)
在您的Character.rb中,添加combine_alignment
方法:
def combine_alignment(left_right, up_down)
return "#{left_right} #{up_down}"
end