Javascript Rails基于下拉菜单选择填充文本区域

Javascript Rails基于下拉菜单选择填充文本区域,javascript,jquery,html,ruby-on-rails,templates,Javascript,Jquery,Html,Ruby On Rails,Templates,我有一个模型(命名模板),其中包含电子邮件模板;模型只需为模板取一个简短的名称(:name),然后是完整的模板本身(:content)。用户应该能够从下拉列表中选择模板,然后文本区域应该显示模板的内容。这应该在提交表单之前进行 我想我能做到这一点的一种方法是使用jQuery。到目前为止,在我的表单中,我正在检测选择,然后用测试消息填充文本区域。我不知道如何返回到选择并将模板的内容放入文本区域。非常感谢您的帮助 这是我的表格: <%= form_for :message, :url =>

我有一个模型(命名模板),其中包含电子邮件模板;模型只需为模板取一个简短的名称(:name),然后是完整的模板本身(:content)。用户应该能够从下拉列表中选择模板,然后文本区域应该显示模板的内容。这应该在提交表单之前进行

我想我能做到这一点的一种方法是使用jQuery。到目前为止,在我的表单中,我正在检测选择,然后用测试消息填充文本区域。我不知道如何返回到选择并将模板的内容放入文本区域。非常感谢您的帮助

这是我的表格:

<%= form_for :message, :url => send_prod_status_path(@incident), :html => {:method => :get} do |f| %>

  <div class="field">
    <%= f.label :template %>    <%= f.collection_select(:template_id, ::Template.all, :id, :name, prompt: "Choose a template") %>
  </div>

<script>
  $("select").change(function(){
    $("textarea").text("Test")
  });
</script>

  <div class="field">
    <%= f.label :prod_status %>
    <%= f.text_area :prod_status %>
  </div>



  <div class="actions">
    <%= f.submit "Send ProdStatus" %>
  </div>
<% end %>
~
send_prod_status_path(@incident),:html=>{:method=>:get}do | f |%>
$(“选择”).change(函数(){
$(“textarea”).text(“测试”)
});
~

编辑:这是Rails 3.2,如果这很重要的话

您有两种方法可以做到这一点:

  • 在页面加载时,以javascript中json对象的形式将所有数据(具有模板Id和模板内容的映射)发送到前端

  • 仅发送模板Id和名称,并在每次更改下拉列表中的选择时发出ajax请求,用模板内容填充文本区域。如果有很多模板,这是一种更好的方法


  • 有两种方法可以做到这一点:

  • 在页面加载时,以javascript中json对象的形式将所有数据(具有模板Id和模板内容的映射)发送到前端

  • 仅发送模板Id和名称,并在每次更改下拉列表中的选择时发出ajax请求,用模板内容填充文本区域。如果有很多模板,这是一种更好的方法


  • 您必须向服务器发出AJAX调用,请求实际的
    模板.text

    类似(代码简化且未经测试):


    您必须向服务器发出AJAX调用,请求实际的
    模板.text

    类似(代码简化且未经测试):


    您需要使用AJAX根据
    template\u id
    selection从数据库中获取信息您需要使用AJAX根据
    template\u id
    selection从数据库中获取信息这是可行的。虽然我必须做一个新的动作,因为我已经有了这个控制器的表演动作。也许这是一个愚蠢的问题,但这是一种快速而肮脏的方式,还是一种正确的方式来做这类事情?这个解决方案没有任何肮脏之处。您可以使用帮助器重复使用相同的操作并做出不同的响应。@irlrobot检查我的更新以获得无需额外ajax调用的解决方案。再次感谢,非常感谢!这起作用了。虽然我必须做一个新的动作,因为我已经有了这个控制器的表演动作。也许这是一个愚蠢的问题,但这是一种快速而肮脏的方式,还是一种正确的方式来做这类事情?这个解决方案没有任何肮脏之处。您可以使用帮助器重复使用相同的操作并做出不同的响应。@irlrobot检查我的更新以获得无需额外ajax调用的解决方案。再次感谢,非常感谢!
    # templates_controller.rb
    def show
      template = Template.find(params[:id])
      render :text => template.content
    end
    
    # form.html.erb
    <script>
      $("select").change(function(){
        $.get( 
          "/templates/" + $("select option:selected").attr("value"), 
          function(data) {
            $("textarea").text(data);
          }
        );
      });
    </script>
    
    # form.html.erb
    <script>
      var templates = [<%= ::Template.all.map(&:to_json).join(",") %>];
    
      $("select").change(function(){
        var template_id = $("select option:selected").attr("value");
        var template_content = get_template_content(template_id)
        $("textarea").text(template_content);
      });
    
      function get_template_content(template_id){
        // to be implemented ...
        return template_content;
      }
    </script>