【问题标题】:Ruby on Rails: Filling in form_for field depending on selection in other fieldRuby on Rails:根据其他字段中的选择填写 form_for 字段
【发布时间】:2016-08-24 07:29:45
【问题描述】:

我有一个交易模型来处理投资组合中股票的买卖。当确定我想买/卖哪只股票时,我有一个使用 options_for_collection_for_select 的下拉菜单。根据我选择的股票代码,我希望 buy_price 字段填写与该股票资源关联的 last_price。 有没有办法存储来自 f.select :stock_id 的选择并使用它来自动填充 buy_price 字段。使用 Rails 或 JavaScript。

<%= form_for([@portfolio, @transaction]) do |f| %>
  <% if @transaction.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@transaction.errors.count, "error") %> prohibited this transaction from being saved:</h2>

      <ul>
      <% @transaction.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :symbol %><br>
    <%= f.select :stock_id, options_from_collection_for_select(Stock.all, :id, :symbol), prompt: 'Please select a stock...' %>
  </div>
  <div class="field">
    <%= f.label :quantity %><br>
    <%= f.number_field :num_of_shares %>
  </div>
  <div class="field">
    <%= f.label :buy_price %><br>
    <%= f.number_field :buy_price %>
  </div>
  <div class="field">
    <%= f.label :buy_date %><br>
    <%= f.datetime_field :buy_date, :value => DateTime.now %>
  </div>

  <div class="actions">
    <%= f.submit class: 'btn btn-success' %>
  </div>
<% end %>

【问题讨论】:

  • 在更改selection 时,您可以向控制器触发ajax 请求并获取last_price。然后更新buy_price 字段。

标签: javascript ruby-on-rails ruby forms


【解决方案1】:

所以,首先你应该给需要修改的字段一些类名:

<%= f.select :stock_id, options_from_collection_for_select(Stock.all, :id, :symbol), prompt: 'Please select a stock...', {class: 'stock'} %>

<%= f.number_field :buy_price, class: "buyprice" %>

然后,要编辑这些字段,您需要多次转义 javascript,所以我用来更改 ruby​​ 变量的是 CDATA。不过,我的缩进可能是错误的(我一直在使用 haml,我必须只将制表符放在 ruby​​ 循环中)。您不能将 javascript 变量放在转义 javascript 中,因此您应该创建一个循环并检查该值,然后使用它更改要更改的字段的值。如果您希望用户不更改输入,也可以将其设为只读或隐藏。

<script>
  \//<![CDATA[
  $(document).ready(function(){
  $(".stock").change(function(){
  stockval = $(this).val();
  <%- Stock.pluck(:id).each do |stock| %>
    if($(this).val() == "#{stock}") {
    $(".buyprice").val("#{Stock.find(stock).last_price)}");
    }
  <%- end %>
  });
  });
  \//]]>
</script>

我不确定这是否完全正确,但我希望这会有所帮助:)。

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2020-04-21
    • 2021-08-09
    相关资源
    最近更新 更多