Javascript来分配RubyonRails表单值

Javascript来分配RubyonRails表单值,javascript,jquery,ruby-on-rails,ruby,ruby-on-rails-4,Javascript,Jquery,Ruby On Rails,Ruby,Ruby On Rails 4,我正在尝试获取一个脚本,以便在提交表单时分配product_id的值。我的脚本现在总是将值指定为1。我需要它来分配产品的产品id。我注意到,当我提交时,它实际上会将选择更改为等于id 1的选择,所以我是否将脚本重写为1时弄糟了 是一个JSFIDLE,它在html中似乎工作得很好,但在我的ruby代码中却不行 脚本: $(function(){ $("#commit").on("click", function(){ var valueAssigned = false; $('se

我正在尝试获取一个脚本,以便在提交表单时分配product_id的值。我的脚本现在总是将值指定为1。我需要它来分配产品的产品id。我注意到,当我提交时,它实际上会将选择更改为等于id 1的选择,所以我是否将脚本重写为1时弄糟了

是一个JSFIDLE,它在html中似乎工作得很好,但在我的ruby代码中却不行

脚本:

$(function(){
$("#commit").on("click", function(){
    var valueAssigned = false;
    $('select').each(function(){
        if($(this).val())
        {
            $("[name='question[product_id]']").val($(this).val());
            valueAssigned = true;
            return;
        }
    });
});
});
形式:请注意,根据所选类别,仅显示所选集合中的一个。脚本将根据选择显示和隐藏它们

<%= form_for @question, url: new_tf_question_path(@question) do |f| %>

<%= render 'shared/error_questions' %>
日志:

新的形式:我只改变了所有的论文和删除脚本

<div id="ip_voice">
<%= f.label :product_id %><br>
<%= f.collection_select :ip_voice_product_id, Product.where({ category: "ip_voice" }), :id, :name, {prompt: "Select a product"}, {class: "form-control input-lg", id: "question_product_id1", name: "voice"} %>
</div>


<%= f.label :category %><br>
<%= f.select :category, [ ["IP Voice Telephony", "ip_voice"], ["IP Video Surveillance", "ip_video_surveillance"], ["IP Video Telephony", "ip_video_telephony"], ["Enterprise Gateways", "enterprise_gateways"], ["Consumer ATAs", "consumer_atas"], ["IP PBX", "ip_pbx"] ], {prompt: "Select Category"}, class: "input-lg", :id => "category" %>

<div id="ip_voice">
<%= f.label :product_id %><br>
<%= f.collection_select :product_id, Product.where({ category: "ip_voice" }), :id, :name, {prompt: "Select a product"}, {class: "form-control input-lg", id: "question_product_id1", name: "voice"} %>
</div>

<div id="ip_video_surveillance">
<%= f.label :product_id %><br>
<%= f.collection_select :product_id, Product.where({ category: "ip_video_surveillance" }), :id, :name, {prompt: "Select a product"}, {class: "form-control input-lg", id: "question_product_id2", name: "surv"} %>
</div>

<div id="ip_video_telephony">
<%= f.label :product_id %><br>
<%= f.collection_select :product_id, Product.where({ category: "ip_video_telephony" }), :id, :name, {prompt: "Select a product"}, {class: "form-control input-lg", id: "question_product_id2", name: "video"} %>
</div>

<div id="consumer_atas">
<%= f.label :product_id %><br>
<%= f.collection_select :product_id, Product.where({ category: "consumer_atas" }), :id, :name, {prompt: "Select a product"}, {class: "form-control input-lg", id: "question_product_id3", name: "atas"} %>
</div>

<div id="enterprise_gateways">
<%= f.label :product_id %><br>
<%= f.collection_select :product_id, Product.where({ category: "enterprise_gateways" }), :id, :name, {prompt: "Select a product"}, {class: "form-control input-lg", id: "question_product_id4", name: "gate"} %>
</div>

<div id="ip_pbx">
<%= f.label :product_id %><br>
<%= f.collection_select :product_id, Product.where({ category: "ip_pbx" }), :id, :name, {prompt: "Select a product"}, {class: "form-control input-lg", id: "question_product_id5", name: "pbx"} %>
</div>

<input id="targetField" type="hidden" name="question[product_id]" value="0"/>

<%= f.label :section %><br>
<%= f.collection_select :section, @sections, :id, :name, {prompt: "Select a section"}, {class: "form-control input-lg" } %>

<%= f.label :active %><br>
<%= f.check_box :active %>


<%= f.fields_for :answers do |builder| %>

<%= render 'tf_answers', :f => builder %>

<% end %>

<%= f.submit "Create Question", class: "btn btn-lg btn-primary", id: "commit", style: "margin-top: 45px;" %>

<% end %>

虽然我不赞成您当前的表单安排,但既然您说只有一个select可见,那么您可以使用jQuery的
:visible
选择器。假设向所有这些select元素添加了
question\u product\u id
类,则可以将JS click处理程序更改为如下内容

var value = $('select.question_product_id:visible').val();
$("[name='question[product_id]']").val(value);
但是,如果是我编写这样的表单,我不会费心使用JS代码设置select值,但我会向问题模型添加大量实例属性(例如,
ip\u video\u telephony\u product\u id
),并将它们用于
f.collection\u select:ip\u video\u telephony\u product\u id
调用,然后在控制器或模型中,我根据类别值计算应该使用哪一个值,诸如此类

示例

模型应该是这样的

class Question < ActiveRecord::Base
   attr_accessor :ip_video_telephony_product_id, :enterprise_gateways_product_id # etc ...
end
<div id="enterprise_gateways">
 <%= f.label :ip_video_telephony_product_id %><br>
 <%= f.collection_select :ip_video_telephony_product_id, Product.where({ category: "enterprise_gateways" }), :id, :name, {prompt: "Select a product"}, {class: "form-control input-lg"} %>
</div>

很好,我必须删除表单中的html设置名称,如您所述。
class Question < ActiveRecord::Base
   attr_accessor :ip_video_telephony_product_id, :enterprise_gateways_product_id # etc ...
end
<div id="enterprise_gateways">
 <%= f.label :ip_video_telephony_product_id %><br>
 <%= f.collection_select :ip_video_telephony_product_id, Product.where({ category: "enterprise_gateways" }), :id, :name, {prompt: "Select a product"}, {class: "form-control input-lg"} %>
</div>
def create
  @question = Question.new(question_params)
  @question.product_id = question_params["#{question_params[:category]}_product_id"]
  # ...
end