[英]How to use one controller view as a partial view for another controller in Ruby on Rails
[英]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.