簡體   English   中英

如何將一個控制器的局部視圖渲染到軌道上的ruby中的另一個控制器

[英]How to render partial view of one controller to another controller in ruby on rails

您好我正在嘗試在供應商網站中實現訂閱按鈕,因此需要呈現具有vendor_site_id的隱藏屬性的訂閱表單。 該表單在訂閱控制器的范圍內工作正常,但我需要在vendor_site / show頁面中將其呈現為部分_new.html.erb。 我無法弄清楚解決這個問題的方法在我自己可以任何身體建議我這個問題。

我的部分視圖訂閱/ _new.html.erb

<%= form_for(@subscription) do |f| %>
  <div class="field">
    <%= f.hidden_field @subscription.vendor_site_id, :value=>"1" %>
  </div>
  <%= button_tag(type: 'submit', class: "btn btn-primary") do %>
    <i class="fa fa-user fa-fw"></i> Subscribe
  <% end %>
<% end %>

現在,當我在vendor_sites / index.html.erb中呈現它時

<h3>This is vendor site with id 1 just for the testing of subscription method</h3>
<%= render :partial => "subscriptions/new" %>

它會拋出一個錯誤,上面寫着:

First argument in form cannot contain nil or be empty

到目前為止我所理解的是,我需要告訴這個vendor_site控制器關於來自其他范圍的@subscription。 但我無法弄清楚如何? 我的訂閱類看起來像這樣:

class SubscriptionsController < ApplicationController
  def new
    @subscription=Subscription.new
  end
end

您需要在此處進行一些更改。 在進入細節之前我會建議的一件事是Rails指南(用於布局和渲染) (以及Rails指南 )。特別是布局和渲染指南將幫助您極大地利用Rails的VC部分。

現在,詳細介紹。 首先,部分不是控制器動作。 沒有與之對應的控制器方法。 您可以通過以下兩種方式之一來嘗試執行的操作,並且這兩種方法都涉及首先從訂閱控制器中刪除new方法。

第一種方法:在供應商站點控制器中初始化@subscription

最簡單的方法(相對於您已有的更改)是在供應商站點控制器的index方法中初始化@subscription 然后,渲染的_new部分將確切地知道subscription是什么。

class VendorSiteController
  def index
    @subscription = Subscription.new # add this anywhere in the index method.
  end
end

方式二:通過@subscription作為本地的_new部分

這種方式將涉及對控制器,視圖和部分的更改。 在您的控制器中,您仍然需要進行上面給出的更改。

class VendorSiteController
  def index
    @subscription = Subscription.new # add this anywhere in the index method.
  end
end

接下來,只需刪除@ ,就需要在表單@subscription為局部變量。

<%= form_for(@subscription) do |f| %>
  <div class="field">
    <%= f.hidden_field @subscription.vendor_site_id, :value=>"1" %>
  </div>
  <!-- no changes to the button tag -->
<% end %>

最后,您需要在索引視圖@subscription作為subscription傳遞給partial。

<%= render :partial => "subscriptions/new", :locals => { :subscription => @subscription } %>

雖然這種方式涉及更多變化,但它比第一種方式更靈活。 例如,假設您要在頁面中呈現多個新訂閱:

<% Subscription.where(condition: true).find_each do |s| %>
  <%= render :partial => "subscriptions/new", :locals => { :subscription => s } %>
<% end %>

另一個例子,也許您希望將@subscription變量名稱用於新訂閱以外的其他名稱,而您將使用@new_sub來代替新訂閱。

<%= render :partial => "subscriptions/new", :locals => { :subscription => @new_sub } %>

希望我的回答可以幫到你! 如果您需要進一步說明,請隨時發表評論,並確保查看那些Rails指南!

您可以通過以下方式執行此操作,您需要在vendor_sites控制器的索引操作中初始化@subscription對象。

class VendorSiteController
   def index
     #here your showing list of vendors logic

     @subscription = Subscription.new #initialize a Subscription object
   end
end

然后你可以通過以下方式將@subscription對象傳遞給索引視圖中的partial(對於Rails 3)

<%= render :partial => "subscriptions/new", :subscription => @subscription } %>

沒有檢查Joe Kennedy的回答,如果這涉及到他寫的內容,請道歉:


諧音

partial的全部意義在於能夠在您的應用程序的任何部分中使用。 它們與特定控制器無關 ,尤其如此,因為它們主要依靠local variables來幫助填充數據

這意味着如果要在控制器的“范圍”之外渲染部分,您只需要能夠通過其local變量將正確的數據發送到部分:

#app/views/controllers/your_view.html.erb
<%= render partial: "controller/partial", locals: {variable: @value} %>

一個非常簡單的例子,但希望能證明你可以在任何你想要的地方調用partials。


MVC

您還必須考慮MVC編程模式 ,如下所述:

在此輸入圖像描述

這一點的重要性在於Rails是使用MVC模式構建的 - 因為controller用於操作data以在視圖中顯示, model用於收集/編譯data ,視圖僅用於顯示

這意味着partial不應該與特定控制器“綁定” - 它只需要創建視圖中可用的data ,因此,您應該更專注於如何顯示此數據,而不是必須調用您的部分與特定的controller


數據

總結到目前為止 - 您需要可以放置任何部分,並通過使用MVC編程模式,使用來自controller數據填充它。

現在重要的是填充@subscription值。 這可以在視圖中完成(不推薦),也可以使用各種控制器中的方法完成:

#app/views/subscriptions/_new.html.erb
<%= form_for(subscription) do |f| %>
  <div class="field">
    <%= f.hidden_field @subscription.vendor_site_id, :value=>"1" %>
  </div>
  <%= button_tag(type: 'submit', class: "btn btn-primary") do %>
    <i class="fa fa-user fa-fw"></i> Subscribe
  <% end %>
<% end %>

#app/views/controller/your_action.html.erb
<%= render partial: "subscriptions/new", partials: {subscription: Subscription.new} %>

暫無
暫無

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

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