在rails中,从另一个控制器的视图中呈现操作方法

时间:2017-11-06 04:13:33

标签: ruby-on-rails

我正在努力实现以下目标:我有一个项目编辑页面,我在其中显示字段以编辑项目详细信息。

下面我将展示分配给该项目的任务列表。

<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>

我得到的输出是: {编辑表单字段+}以及以下部分视图中的文本

Im partial : my name is

如“xyz”所示,不打印实例变量的值。

经过一些研究后我发现,我的代码直接呈现视图,而不调用action方法。这是不支持rails?

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

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

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

总结一下,我的期望是

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

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

提前致谢。

3 个答案:

答案 0 :(得分:0)

  

在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以获得更清晰的信息。

答案 1 :(得分:0)

  

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

在任何控制器中

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

在视图中

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

答案 2 :(得分:0)

渲染不会调用控制器的操作方法,而是直接渲染html.erb。因此,在渲染屏幕之前,您需要确保计算和初始化所有因变量。

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

public  var Player : GameObject;
//call this method at desired event
    function DestroyPlayer(){
        Destroy(Player);
    }