【问题标题】:Best way to fix undefined method修复未定义方法的最佳方法
【发布时间】:2019-09-04 00:22:34
【问题描述】:

我正在构建一个 Rails 应用程序,其中有一个博物馆页面,该页面具有一个功能,可以显示拥有最多展品的博物馆。问题是,当没有展品添加到数据库时,它会给出一个未定义的方法“museum_name”。所以我遇到的问题是,我不确定如果有零展品,什么是进行检查仍允许我访问该页面的最佳方法?

博物馆管理员:

def index
   @museums = Museum.all
   most_exhibits = Exhibit.most_exhibits
   most_exhibits.each do |museum|
   @top_museum = MuseumsHelper.get_museum_name(museum.museum_id)[0]
end

正在使用的助手类方法:

  def self.get_museum_name(museum_id)
    Museum.where(id: museum_id)
  end

在视图中显示:

<%= @top_museum.museum_name %>

【问题讨论】:

  • 方法名称get_museum_name 具有误导性。这意味着它返回一个博物馆的名称,即一个字符串。但相反,它返回一个包含整个博物馆的数组(或一个空数组)。修复这些怪癖可以更容易地推断出实际的错误。

标签: ruby-on-rails ruby undefined nomethoderror


【解决方案1】:

做到这一点的最佳方式取决于您想要的方式。我认为您的理想解决方案是检查if/else,然后相应地显示内容:

<% if @top_museum.present? %>
  <%= @top_museum.museum_name %>
<% else %>
  <span>Nothing to display</span>
<% end %>

或者使用try&lt;%= @top_museum.try(:museum_name) %&gt;,或者如果你有ruby 2.3.0或更高版本,你可以使用安全导航运算符&lt;%= @top_museum&amp;.museum_name %&gt; (Read more)。

【讨论】:

    【解决方案2】:

    你可以在你的助手中使用 try,这样它会尝试查询,如果失败则返回 nil

    def self.get_museum_name(museum_id)
       Museum.try(where(id: museum_id))
    end
    

    参考:https://apidock.com/rails/v3.2.1/Object/try

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多