在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 的第一行来轻松做到这一点。 如果上述方法成功,请确保您在可变内容上方或下方有一些非可变内容。例如,使用 &lt;h1&gt;Hello World!&lt;/h1&gt; 开始您的 _table 部分以确保它呈现。这样你就不用依赖变量来显示一些东西了。如果您的 JavaScript 选择器是正确的,您应该会看到此内容出现在您的页面上。然后,您可以开始测试您的变量是否包含它们应该包含的值。 谢谢你,这一切都有效。我可以看到console.log("Hello World!")&lt;h1&gt;Hello World!&lt;/h1&gt; 作为部分_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请求将参数传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章

在 pentaho CDE 中通过kettleTransFromFile 将参数传递给 pentaho 水壶

将参数传递给 ajax 发布请求会返回错误

将ajax请求中的多个参数传递给函数后面的C#代码

Rails:将参数传递给关注点

如何正确地将参数传递给rails表单

在 ajax 调用中使用 datatable url 属性将参数传递给服务器