【问题标题】:Is it possible to access a controller's instance variable in a partial if the partial is being rendered by a different controller's view?如果部分由不同控制器的视图呈现,是否可以在部分中访问控制器的实例变量?
【发布时间】:2014-09-02 00:18:36
【问题描述】:

大家好,提前感谢您的帮助。我正在使用 Rails 构建一种在线游戏。用户界面都应该以一个页面为中心:用户/...我在创建用户之外的对象并与之交互时遇到了问题。例如,在用户页面中,用户应该具有创建堡垒的能力。堡垒当然是它自己的对象,有自己的模型和控制器。如果我尝试在用户页面中使用 form_for 标记创建一个表单来创建堡垒,该表单将无法访问堡垒控制器的 @fort 实例变量并引发错误。为了解决这个问题,我创建了一个名为 _new.html.erb 的堡垒的局部视图,其中包含堡垒形式

这里是:

<h1>Create a New Fort</h1>
    <%= form_for(@fort) do |f| %>
    <%= render 'shared/error_messages' %>
      <%= f.label :name %>
      <%= f.text_field :name %>

      <%= f.label :ownership %>
      <%= f.text_field :ownership %>

<div style="display:none;">

      <%= f.label :xco %>
      <%= f.text_field :xco %>

      <%= f.label :yco %>
      <%= f.text_field :yco %>

      <%= f.label :territory %>
      <%= f.password_field :territory %>

</div>

      <%= f.submit "Create a Fort" %>
    <% end %>

然后我在我的用户 show.html.erb 中呈现该部分:

<%= render "forts/new" %>

当然,将表单移动到部分表单根本没有任何作用,但我希望做的事情是这样的:

<%= render partial: "new", object: @fort %>

我想将 fort 实例变量传递给部分,然后在用户视图中呈现部分。然而,我认识到如上所述传递给局部的变量直接来自呈现局部的视​​图,并且在实现这一点时,我无所适从。

我已经考虑过关键可能在关联中的某个地方,我一直在网上搜寻相关信息。我的模型设置为一个用户拥有_许多堡垒和一个堡垒属于_一个用户。不知道有没有用。

感谢所有帮助,

谢谢你,

亚历克斯

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rendering partial-views


    【解决方案1】:

    从您的外观来看,假设 @fort 已在您的控制器中实例化,您可以像这样将 @fort 直接传递给您的部分:

    <%= render 'forts/new', :fort => @fort %>
    

    【讨论】:

      【解决方案2】:

      我认为您正在寻找的是accepts_nested_attributes_forThisRailsCast 解释了它是如何使用的。

      在您的情况下,您可以将 accepts_nested_attributes_for :forts 添加到您的用户模型中。我不确定您的用户/显示视图是什么样的,但您应该能够添加一个 &lt;%= f.fields_for :forts do |f| %&gt;,其中包含当前在 forts/new 中的字段。

      【讨论】:

        【解决方案3】:

        是的,您可以在调用 partial 的任何地方使用带有渲染语句的 Locals 传递。

                    <%= render 'shared/error_messages', :locals => {:info => first, :img_style => "original"} %>
        

        【讨论】:

          猜你喜欢
          • 2011-09-20
          • 1970-01-01
          • 2017-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多