【问题标题】:Is there a way to use Rails Scaffold data in a different view?有没有办法在不同的视图中使用 Rails Scaffold 数据?
【发布时间】:2021-02-14 00:35:43
【问题描述】:

我在 rails 中生成了一个 Scaffold,其中包含有关某些植物的一些信息:名称、描述。身份证。

我想在我的root "home#index" 中显示该信息

但是索引页面没有呈现,我得到了错误:

Home#index 中的 NoMethodError

nil:NilClass 的未定义方法 `each'

>

这是我的代码

我知道它不是在“导入”我的@plants 类,那么如何将它导入到不同的视图中?

<table class="table">
  <tbody>
    <% @plants.each do |plant| %>
      <tr>
        <td><%= plant.plant_name %></td>
        <td><%= plant.plant_description %></td>
        <td><%= plant.plant_id %></td>
      </tr>
    <% end %>
  </tbody>
</table>

【问题讨论】:

  • 您必须将创建该变量添加到家庭控制器索引方法中。如果您查看植物的方法,很可能是@plants = Plant.all,对吗?把它放在 home 控制器索引方法中,您将创建变量,以便您可以使用它。只是要清楚你不要“导入”它。您必须创建变量才能使用它,并且每个页面都有一个方法,在该方法中您可以创建要在视图中使用的任何变量。
  • 谢谢,这太完美了。你为什么不回答而不是评论,所以我可以检查它是正确的答案?
  • 好吧,没有代码我无法真正提供实际答案,所以我只是向您解释了发生了什么。另外,我确信这已经在之前的某个地方得到了回答。希望这有意义。

标签: ruby-on-rails ruby


【解决方案1】:

你在这里的概念都错了。 Rails 脚手架命令设置模型、控制器和视图。脚手架命令不设置任何数据。您将使用rails db:seed 命令设置数据。 @plants 不是一个类 - 它只是一个实例变量,脚手架将分配给 Plant.all

在 Ruby 中,您可以引用一个实例变量,即使它没有被定义并且简单地得到 nil。但是当你调用@plants.each do |plant| 时,你会得到一个错误,因为你调用#each 时是零。这是 Ruby 中的一个关键问题,它往往会让初学者甚至有时甚至是经验丰富的开发人员都感到困惑。

在 Rails 中,每个请求都由路由器匹配到控制器和操作(控制器上的方法)。如果您想在 HomeController 上显示植物列表,您需要分配该实例变量:

class HomeController < ApplicationController
  def index
    @plants = Plant.all
  end
end

Rails 然后将控制器的所有实例变量“提供”给视图 - 这称为 视图上下文

如果您想在 HomeController 和 PlantController 之间共享代码,您可以使用模块:

module Planted
  extend ActiveSupport::Concern

  included do
    before_action :set_plants, only: [:index]
  end

  def set_plants
    @plants = Plant.all
  end
end

class PlantsController < ApplicationController
  include Planted
  # ...
end

class HomeController < ApplicationController
  include Planted
  # ...
end

如果通过liskov substitutability principle,则为继承。

如果您想分享查看代码,请使用partials

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-17
    • 2011-10-11
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多