导轨 - 预填充文本区域与现有的属性

问题描述:

我有以下情况:导轨 - 预填充文本区域与现有的属性

我有两个型号

  • 的风险模型的属性名称,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的回应。

+0

thx!我认为你所描述的解决方案是要走的路。我编辑了这个问题并添加了一些javascript代码。 你能帮我多一点与JavaScript代码?我该如何改变它重新渲染textarea? – 2013-05-02 09:31:08

+0

您应该检出这个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

+0

thx了! :)遵循你的描述,现在就工作!上面粘贴了我的工作代码。 – 2013-05-03 15:38:43

编制对象@Risk时,您可以做到这一点的控制器。类似这样的:

@risk = Risk.new(description: "blah blah") 

然后窗体将具有此值与form_for标记。

+0

,因为这不是基于我不认为这会工作..可能是有一个missunderstanding ..作为描述应该基于表单中的选定风险等级进行设置,我不能在控制器中做到这一点在形式上的选择..你明白我的意思吗? – 2013-05-02 09:01:16