导轨 - 预填充文本区域与现有的属性
问题描述:
我有以下情况:导轨 - 预填充文本区域与现有的属性
我有两个型号
- 的风险模型的属性名称,risk_class_id,描述,水平
- 一个Risk_Class模型与属性的名称和描述
风险有一个风险等级和风险等级有很多风险。这个协会工作正常。我可以为风险分配风险等级。要创建一个风险我用下面的形式:
<%= form_for @risk, :html => { :class => 'form-horizontal' } do |f| %>
<div class="control-group">
<%= f.label :name, :class => 'control-label' %>
<div class="controls">
<%= f.text_area :name, :class => 'text_area' %>
</div>
</div>
<div class="control-group">
<%= f.label :risk_class_id, :class => 'control-label' %>
<div class="controls">
<%= collection_select(:risk, :risk_class_id, RiskClass.all, :id, :name, :prompt => true) %>
</div>
</div>
<div class="control-group">
<%= f.label :description, :class => 'control-label' %>
<div class="controls">
<%= f.text_area :description, :class => 'text_area' %>
</div>
</div>
<div class="control-group">
<%= f.label :level, :class => 'control-label' %>
<div class="controls">
<%= f.text_area :level, :class => 'text_area' %>
</div>
</div>
<div class="form-actions">
<%= f.submit nil, :class => 'btn btn-primary' %>
</div>
<% end %>
现在我想有,对于描述textarea的领域系统会根据所选择的风险等级预填充,作为风险类有一个说明。
感谢您的帮助!
编辑
我已经添加下面的JavaScript代码的形式和编辑的集合中选择下列方式:
<%= javascript_tag do %>
function risk_class_selection(riskclassId){
window.alert(riskclassId);
}
<% end %>
<div class="control-group">
<%= f.label :risk_class_id, :class => 'control-label' %>
<div class="controls">
<%= collection_select(:risk, :risk_class_id, RiskClass.all, :id, :name, {:prompt => true} , {:onchange => "risk_class_selection(this.value)"}) %>
</div>
</div>
SOLUTION: 如果有人有兴趣我也跟着一路grotori描述和我的解决方案,现在看起来是这样的:
我有了这个risk.js文件:
function risk_class_selection(riskclassId){
if (riskclassId != ""){
$.getJSON("/risk_classes/"+riskclassId+".json", function(data){
if ($('#risk_description').val() == ""){
$("#risk_description").val(data.description);
}
else{
if (confirm('Are you sure you want to change the risk description?')){
$("#risk_description").val(data.description);
}
else{
}
}
}
)
}
else{}
}
而且在风险表格我已经得到了与onchange事件和第二地方textarea的,应预先填入第一个div:
<div class="control-group">
<%= f.label :risk_class_id, :class => 'control-label' %>
<div class="controls">
<%= collection_select(:risk, :risk_class_id, RiskClass.all, :id, :name, {:prompt => true} , {:onchange => "risk_class_selection(this.value)"}) %>
</div>
</div>
<div class="control-group">
<%= f.label :description, :class => 'control-label' %>
<div class="controls">
<%= f.text_area :description, :class => 'text_area' %>
</div>
</div>
答
您必须绑定一个onchange事件,你选择现场,将回发到服务器的用户的选择和使用JavaScript将重新呈现你想要的理想值textarea的回应。
答
编制对象@Risk时,您可以做到这一点的控制器。类似这样的:
@risk = Risk.new(description: "blah blah")
然后窗体将具有此值与form_for
标记。
+0
,因为这不是基于我不认为这会工作..可能是有一个missunderstanding ..作为描述应该基于表单中的选定风险等级进行设置,我不能在控制器中做到这一点在形式上的选择..你明白我的意思吗? – 2013-05-02 09:01:16
thx!我认为你所描述的解决方案是要走的路。我编辑了这个问题并添加了一些javascript代码。 你能帮我多一点与JavaScript代码?我该如何改变它重新渲染textarea? – 2013-05-02 09:31:08
您应该检出这个http://www.simonecarletti.com/blog/2010/06/unobtrusive-javascript-in-rails-3/它解释了一般的想法。简而言之,在“更改”事件中,您必须使用有效的网址进行$ .ajax调用,该网址将用例如javascript来替换文本区域的内容。注意,你的控制器将要执行的动作必须是respond_to format.js/format.json或者你决定的任何东西。 – 2013-05-02 09:39:38
thx了! :)遵循你的描述,现在就工作!上面粘贴了我的工作代码。 – 2013-05-03 15:38:43