如何组合表单中的两个选择字段

时间:2015-07-23 19:47:46

标签: javascript jquery html ruby-on-rails ruby-on-rails-4

我尝试在提交表单之前将表单中两个选择字段的值组合成一个变量。

以下是我的代码:

在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来解决此问题。

3 个答案:

答案 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保存到数据库的实际值。虚拟属性允许您的表单包含与模型中的字段不直接对应的字段。

  1. 创建一个删除&#34; alignment_lr&#34;和&#34; alignment_ud&#34;列并用一列&#34;对齐替换它们。&#34;理想情况下,您可以将数据库规范化,使每个对齐组合保存到路由表中,并且您要保存密钥,而不是动态生成的字符串,但这是一个不同的问题;

  2. Character.rb模型中,添加attr_accessor行:

    class Character < ActiveRecord::Base
    
        attr_accessor: :alignment_lr, :alignment_ud
    
  3. 在您的characters_controller.rb文件中,将:alignment_lr:alignment_ud添加到您的强参数(character_params方法)

  4. 您仍然可以完全按照已有的f.select语句撰写。

  5. 使用characters_controller.rb create方法:

    @character.combine_alignment(@character.alignment_lr, @character.alignment_ud)
    
  6. 在您的Character.rb中,添加combine_alignment方法:

    def combine_alignment(left_right, up_down)
       return "#{left_right} #{up_down}"
    end