簡體   English   中英

在Rails中,從另一個控制器的角度渲染一個動作方法

[英]In rails render an action method from a view of another controller

我正在嘗試實現以下目標:我有一個“項目”編輯頁面,在該頁面上顯示用於編輯項目詳細信息的字段。

在此之下,我顯示了分配給該項目的任務列表。

<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控制器的索引方法中設置它。 這樣,我的編輯視圖或操作不知道部分視圖需要什么數據,這是部分方法負責提供該數據的責任。

提前致謝。

在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

您可以按照以下說明進行更清晰的說明。

不要在partial中使用實例變量,因為它會與控制器動作緊密耦合,這是一種不好的做法。 而是將這些數據作為本地數據傳遞。

在任何控制器中

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

視野中

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

渲染不調用控制器的操作方法,而是直接渲染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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM