Rails根据下拉菜单选择填充文本区域

时间:2014-01-06 19:15:46

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

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

我认为我可以通过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 %>
~

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

2 个答案:

答案 0 :(得分:4)

您必须向服务器发出AJAX调用,询问实际的Template.text

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

# 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>

更新:完整的JS方法

您还可以将所有Templates信息存储在JS对象中,并使用它来刷新textarea

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

# 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>

答案 1 :(得分:0)

您有两种方法可以执行此操作:

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

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