【问题标题】:ROR application - pass data from view to controllerROR 应用程序 - 将数据从视图传递到控制器
【发布时间】:2014-09-26 06:01:56
【问题描述】:

尝试使用 Javascript 将数据从视图传递到控制器。我该怎么做呢 ?具体来说,我希望在控制器中访问的信息是在屏幕上可变数量(一对多)的选择中选择了哪些选项。

我正在开发一个 ROR 应用程序,在“公司 - 钻探兴趣”屏幕上,我希望使用 java/coffeescript 发送数据并调用控制器操作。在控制器中,我无法访问我需要响应的所有数据。那就是我无法确定用户选择了什么“已保存的假设”。

从公司控制器构建数组(我应该这样做还是使用其他方法)保存的假设。

def companies_drill_interests
    # intial display use first (if present) user drill evaluations
    @result_list = Array.new
    @company_listings.each do |cl|
      @drill_interests.each do |di|
        target_share_price = 0
        result = Hash.new
        result["cl_display_name"] = cl.display_name
        result["di"] = di.drill.name
        result["target_share_price"] = 0
        # if saved assumptions grab first assumption and then first target_share_price
        @matched_evaluation_assumption = 
          EvaluationAssumption.matched_eval_assum(@current_user.id,  di.drill_id)
          ...
          # code that builds result ...
          end
        end  
        @result_list << result
      end
    end
  end

来自屏幕的部分视图/公司/_companies_drill_interests

<%= simple_form_for @company,
    html: { class: 'infogroup',
    id: "x_company_drill_interests"} do |f| %>
  <div class="infogroup-header">Drill Interests</div>  
  <div class="infogroup-body">
    <table border="0" cellpadding="0" cellspacing="0" class="info"> 
     <th class="very_large_column lalign">Drill Name</th>   
     ...
     <% if @drill_interests.present? %>
       <% index = 0 %>
        <% @drill_interests.each do |drill_interest| %>  
          <%= fields_for "drill_interest[]", drill_interest do |di| %>
            <tr>
              <td><%= drill_interest.drill.name %></td>
              <td class="ralign"><%= drill_interest.equity_percentage %></td>
              <% array_name = "evaluation_assumption" + index.to_s %>
              <td id="x_user_eval_assum" class='lalign large_column' data-targets="<%= @probability_json %>"> 
              <td> <%= select("mea_user_save_name", "id",
                  @assumptions[array_name].collect {|r| [ r["mea_user_save_name"], r["id"] ] },
                  { :include_blank => false })  %> </td>  
              <% index += 1 %>
            </tr>
          <% end %>
          ...

如果用户更改“已保存的假设”选择,则会在 jave/coffeescript 中检测到。来自 app/assets/javascript/companies.js.coffee

...
   $('#x_company_drill_interests').change((event) ->
          company_id = $('.form.companies_drill_interests').attr('data-companyid')
          event.preventDefault() 
          calculateResult company_id 
   )

calculateResult = (company_id)-> 
data = $('#x_company_drill_interests').serialize()
$.ajax
   url:"/companies/#{company_id}/projection.json",
   type:"post"
   ...

在公司控制器中显示执行我无法上班的操作的声明。

class CompaniesController < ApplicationController
   ...
  def projection
    puts "================================="
    puts "params = " + params.to_s
    puts "=================================" 
    ...

在此语句的日志输出中

params = {"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"rFx8TBWnECUCxFiEBQ+0lTmkvhUKEJrUx/SlEQNPEP8=", "mea_user_save_name"=>{"id"=>""}, "action"=>"projection", "controller"=>"companies", "id"=>"18", "format"=>"json"}.  The arrays are not present.

模型之间的关系概览。 公司有 0 到多个 Drill_Interests。每个 Drill_interest 有 0 到多个 Evaluation_Assumptions(并且使用 Evaluation_Assumptions 我希望显示 User_Evaluation_Results)。

如果您希望看到上面的内容,可以按照以下说明访问该应用程序。 1-转到http://quiet-fortress-3338.herokuapp.com/users/login 2- 使用用户 ID = pmlc 和密码 = gmfive99 登录 3- 从菜单顶部 RHS 中选择公司 4-选择ADO 5- 选择屏幕“公司钻探兴趣” 您会看到 ADO 对“Temp-01”和“ZZZ-Unlimited”都感兴趣,并为这两个保存了许多假设

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    你正在使用fields_for,所以改变:

    <td> <%= select("mea_user_save_name", "id",
                     @assumptions[array_name].collect {|r| [ r["mea_user_save_name"], r["id"] ] },
                    { :include_blank => false })  %> </td>
    

    <td> <%= di.select("mea_user_save_name", "id",
                      @assumptions[array_name].collect {|r| [ r["mea_user_save_name"], r["id"] ] },
                      { :include_blank => false })  %> </td>
    

    【讨论】:

    • 改变 "
    【解决方案2】:

    尝试使用 select_tag 代替 select

    【讨论】:

    • 一直在尝试 select_tag 但没有得到它的工作。声明看起来如何?
    【解决方案3】:

    对不起,我不能发表评论,没有那么大的声誉。

    select_tag 语句

    select_tag "whatever_name", options_from_collection_for_select(@assumptions[array_name].collect {|r| [ r["mea_user_save_name"], r["id"] ] }, "id", "mea_user_save_name"), include_blank: true
    

    【讨论】:

    • Sontya - 非常感谢 - 我如何将结果传递给控制器​​?使用“x_company_drill_interests”,它在控制器中看起来好像没有数据从 javascript 发送到控制器。
    • 看到这篇文章可能会有所帮助 [stackoverflow.com/questions/25459743/…
    【解决方案4】:

    要使用字段发送和数组到后端,字段必须命名

    <input name="myfieldarray[]">
    

    这样 form.serialize() 会为 myfieldarray 发送一个数组。

    检查这个问题

    How to pass an array from view to controller in Ruby on Rails

    试试这个。

    select_tag "my_array_param[]", options_from_collection_for_select(@assumptions[array_name].collect {|r| [ r["mea_user_save_name"], r["id"] ] }, "id", "mea_user_save_name"), include_blank: true
    

    【讨论】:

      猜你喜欢
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2017-11-30
      相关资源
      最近更新 更多