【问题标题】:In rails render an action method from a view of another controller在 Rails 中,从另一个控制器的视图中渲染一个动作方法
【发布时间】:2018-04-18 04:25:46
【问题描述】:

我正在尝试实现以下目标:我有一个项目编辑页面,我在该页面上显示用于编辑项目详细信息的字段。

下面是分配给这个项目的任务列表。

<h1>Editing Project</h1>

<%= render 'form', project: @project %>

<%= render '/project_tasks/index', action: 'index', controller: 'ProjectTasks' %>

<%= link_to 'Show', @project %> |
<%= link_to 'Back', projects_path %>

如上所示,我正在尝试调用控制器“ProjectTasks”的名为“index”的操作方法

下面是 ProjectTasks 控制器的代码:

   class ProjectTasksController < ApplicationController

      def index

          @project_clients = ProjectTask.all
          @myname='xyz'
          render :partial
      end

    end

以及部分视图的文本:\views\project_tasks_index.html.erb

<h1> Im partial : my name is  <%= @myname%></h1>

我得到的输出是: {edit form fields + } 及以下部分视图中的以下文本

Im partial : my name is

如“xyz”所示,实例变量的值没有打印出来。

经过一番研究,我发现,我的代码直接渲染视图,没有调用 action 方法。 Rails 不支持这个吗?

我来自 asp.net mvc 背景,这在 asp.net 中是可以实现的,如下所示:

@{Html.RenderAction("ProjectUserList", new { projectId = Model.Id }); }

粘贴只是为了让我的观点更清楚,它的作用是执行方法而不是直接渲染视图。

总结一下,我期待的是

edit.html.erb -> 从 project_tasks 控制器调用渲染操作 -> 我在那里设置 @myname -> 然后它呈现部分视图 -> 视图显示 @myname 值。

我不想在项目控制器的编辑方法中设置@myname,而是在 project_tasks 控制器的索引方法中设置。这样,我的编辑视图或操作不知道部分视图需要什么数据,它负责提供该数据的部分方法。

提前致谢。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    在 Rails 中,Action 是一个控制器方法页面模板

    所以这里对应于您的index 操作,您应该有index.html.erb 页面模板

       class ProjectTasksController < ApplicationController
          def index
              @project_clients = ProjectTask.all
              @myname='xyz'
          end
        end
    

    views/project_tasks/index.html.erb 中,您可以获得@project_clients@myname 的值

    您可以关注this 以获得更多信息。

    【讨论】:

    • 这里的主要问题是我在 project_tasks 控制器的 index 方法中设置了@myname,然后我从编辑视图调用渲染这个部分。发生这种情况时,它直接调用局部视图,并且由于我没有在编辑方法中设置变量,因此局部视图不会得到这个值。我已经更新了我的问题,请检查。
    【解决方案2】:

    不要在部分内部使用实例变量,这会与控制器动作紧密耦合,是一种不好的做法。而是将这些数据作为本地人传递。

    在任何控制器中

    render partial: 'your_partial', locals: { myname: @myname }
    

    考虑中

    <h1> Im partial : my name is  <%= myname %></h1>
    

    【讨论】:

      【解决方案3】:

      render不调用控制器的action方法,而是直接渲染html.erb。所以在渲染屏幕之前,你需要确保所有的因变量都被计算和初始化。

      为了解决这个问题,您可以使用 AJAX,它会在加载编辑项目屏幕时呈现项目任务列表。

      #project_tasks/edit.html.erb
      <h1>Editing Project</h1>
      
      <%= render 'form', project: @project %>
      
      <div id='project_task_listing'></div>
      
      <%= link_to 'Show', @project %> |
      <%= link_to 'Back', projects_path %>
      
      <script>
        $(function(){
          $.ajax({
              //make ajax request to action: 'index', controller: 'ProjectTasks' and in response update div with id 'project_task_listing'
          });
        });
      <script>
      

      【讨论】:

      • 是的,只有两个选项要么在渲染页面编辑页面上初始化变量,要么使用 ajax 向渲染列表的控制器和操作发出请求。
      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      相关资源
      最近更新 更多