在rails应用程序中通过ajax请求将参数传递给控制器
Posted
技术标签:
【中文标题】在rails应用程序中通过ajax请求将参数传递给控制器【英文标题】:Passing parameters to controller through ajax request in rails application 【发布时间】:2021-10-07 20:42:16 【问题描述】:我需要通过 ajax 将数据传递给控制器。 我在页面 /admin/projects/report_project_resources.html.erb
中有这个<%= select("project", "report", Project.where(closed: false).collect |p| [ p.name, p.id ] , prompt: "Seleziona un piano formativo" ) %>
<div id="hiddenField" style="display: none">
<div class="row">
<div class="col-xs-12">
<div style="margin: 20px 20px;">
<%= link_to 'Genera report', generate_project_resource_associations_admin_projects_path, :class => "btn btn-default" %>
</div>
<div class="box">
<!-- /.box-header -->
<div class="box-body" id="table-box">
<%= render :partial => "table" %>
</div>
<!-- /.box-body -->
</div>
<!-- /.box -->
</div>
</div>
</div>
当我从列表中选择一个项目时,我会显示部分/admin/projects/_table,所以我使用以下脚本:
$("#project_report").change(function()
if ($(this).val() !== '')
$("#hiddenField").show();
var project_id = $(this).val();
$.ajax(
type: "GET",
url: "/admin/projects/report_project_resources.js",
data:
projectId: project_id
);
console.log(data);
else if ($(this).val() === '')
$("#hiddenField").hide();
);
我有一个 /admin/projects/report_project_resources.js.erb 文件,其中包含:
$('#table-box').html("<%= escape_javascript (render partial: 'table') %>");
打开我的部分。 在我的部分 _table 文件中,我现在只有以下内容:
<h1><%= params[:projectId] %></h1>
测试通过的参数。 如果我尝试将参数存储在控制器内的变量中,我不能。我试着写在/admin/projects/projects_controller.rb:
def report_project_resources
@project = params[:projectId]
project = Project.find_by(id: @project)
end
但我看不到 @project 找到的项目。 有人可以帮助我吗?谢谢。
【问题讨论】:
你没有向我们提供那么多调试细节。 “看不到项目” 涵盖了相当大的空白。您是否检查过请求是否成功执行?转到您的 Web 浏览器开发工具并在网络请求下查看是否发出请求以及响应是什么。接下来要检查的是返回的 JavaScript 是否实际执行。您可以通过将行console.log("Hello World!")
作为 report_project_resources.js.erb 的第一行来轻松做到这一点。
如果上述方法成功,请确保您在可变内容上方或下方有一些非可变内容。例如,使用 <h1>Hello World!</h1>
开始您的 _table 部分以确保它呈现。这样你就不用依赖变量来显示一些东西了。如果您的 JavaScript 选择器是正确的,您应该会看到此内容出现在您的页面上。然后,您可以开始测试您的变量是否包含它们应该包含的值。
谢谢你,这一切都有效。我可以看到console.log("Hello World!")
和<h1>Hello World!</h1>
作为部分_table 的标题。但是我也可以看到在我的 _table 部分中传递的参数params[:projectId]
,但是如果我尝试在控制器中使用它,它就不起作用了。
你知道project = Project.find_by(id: @project)
找到的项目是存储在一个局部变量中的吗?因此无法通过视图/部分访问。您的意思是使用@project = Project.find_by(id: params[:projectId])
吗?如果要从视图或部分访问变量,则需要 @
。 “不起作用”是什么意思?你的意思是params[:projectId]
是控制器内的nil
吗?您是否在控制器操作中设置了断点并检查了params
?
【参考方案1】:
我在这方面还是很陌生,但这有帮助吗?
config/routes.rb
get :report_project_resources, to: "projects#report_project_resources", as: :report_project_resources
report_project_resources.html.erb
<%= select_tag "project", options_from_collection_for_select(Project.all, "id", "name"), prompt: "Select something", id: "project-select" %>
<div class="box-body" id="table-box">
<%= render partial: "shared/table", locals: report: "" %>
</div>
shared/_table.html.erb
(部分)
<h1><%= report.present? ? report.name : "None" %></h1>
projects/projects_controller.rb
def report_project_resources
@report = params[:projectId].present? ? Report.find_by(project_id: params[:projectId]) : ""
respond_to do |format|
format.html render partial: "shared/table", locals: report: @report
end
end
app/assets/javascripts/projects.js
$('#project-select').on('change', function ()
var project_id = $(this).val();
$.ajax(
type: "GET",
url: "/report_project_resources",
data: projectId: project_id
).done(function(result)
$("#table-box").html(result);
).fail(function()
console.log("error")
);
);
也许这不是您想要的,但希望它有所帮助! :)
【讨论】:
以上是关于在rails应用程序中通过ajax请求将参数传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章