我有一个包含电子邮件模板的模型(名为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
答案 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>
您还可以将所有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)
您有两种方法可以执行此操作:
在javascript中以json对象的形式将所有数据(具有模板ID和模板内容的映射)发送到页面加载的前端。
仅发送模板ID和名称,并通过每次更改下拉列表中的选择时发出ajax请求,使用模板内容填充文本区域。如果您有很多模板,这是一种更好的方法。