尝试使用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”都感兴趣,并为两者保存了一些假设
答案 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