gpt4 book ai didi

ruby-on-rails - 如何在 ruby​​ on rails 中将一个 Controller 的部分 View 渲染到另一个 Controller

转载 作者:行者123 更新时间:2023-12-04 03:36:46 26 4
gpt4 key购买 nike

嗨,我正在尝试在供应商站点中实现订阅按钮,因此需要为 vendor_site_id 呈现带有隐藏属性的订阅表单。该表单在订阅 Controller 的范围内工作正常,但我需要在 vendor_site/show 页面中将其呈现为部分 _new.html.erb。我想不出解决这个问题的方法,任何人都可以建议我解决这个问题。

我的部分 View 订阅/_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 Controller 关于来自其他范围的 @subscription 。
但我想不通怎么办?
我的订阅类如下所示:
class SubscriptionsController < ApplicationController
def new
@subscription=Subscription.new
end
end

最佳答案

您需要在此处进行一些更改。在详细介绍之前,我要推荐的一件事是 Rails Guides for Layouts and Rendering (通常还有 Rails Guides。特别是布局和渲染指南将极大地帮助您使用 Rails 的 VC 部分。

现在,进入细节。首先,部分不是 Controller 操作。没有与之对应的 Controller 方法。您可以通过以下两种方式之一进行尝试,两种方式都涉及删除 new首先来自您的订阅 Controller 的方法。

第一种方式:初始化 @subscription在您的供应商站点 Controller 中

最简单的方法(相对于您已有的更改而言)是初始化 @subscription在您的供应商站点 Controller 的 index 中方法。然后,渲染 _new部分会知道究竟是什么subscription是。

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

第二种方式:通行证 @subscription作为本地的 _new部分的

这种方式将涉及对 Controller 、 View 和局部的更改。在您的 Controller 中,您仍然需要进行我上面给出的更改。
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 %>

最后,您需要通过 @subscriptionsubscription到您的索引 View 中的部分。
<%= 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 指南!

关于ruby-on-rails - 如何在 ruby​​ on rails 中将一个 Controller 的部分 View 渲染到另一个 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24623161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com