ROR应用程序 - 将数据从视图传递到控制器

时间:2014-09-17 00:50:19

标签: ruby-on-rails

尝试使用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 / _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-登录userid = pmlc和密码= gmfive99 从菜单顶部RHS中选择3家公司 4-选择ADO 5-选择屏幕“公司钻兴趣” 您将看到ADO对“Temp-01”和“ZZZ-Unlimited”都感兴趣,并为两者保存了一些假设

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

尝试使用select_tag而不是select

答案 2 :(得分:1)

抱歉,我无法发表评论,也没有那么多声誉。

选择标记语句

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

答案 3 :(得分:0)

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

<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