【问题标题】:DRYing my views, helper / method / something else?干燥我的观点,助手/方法/其他东西?
【发布时间】:2009-11-17 13:20:01
【问题描述】:

过去曾编写过一些 RoR 网站,但从来没有过多费心于干掉我的观点,因为只有我在看代码。

刚开始一个新网站,很可能是合作,需要帮​​助

我在我的视图中多次调用这条线,并从多个地方。

<%= Person.find_by_id(rider.person_id).name %>

我希望能够做到

<%= get_name(rider.person_id) %>

所以我假设我会把这段代码放在某个地方

def get_name=(id)
    Person.find_by_id(id).name
end

但是在哪里?我在模型中尝试过并作为助手,但总是得到 nomethoderror。

【问题讨论】:

  • 你为什么要这样做?如果您的关联设置正确。 rider.person.name 应该足够了。

标签: ruby-on-rails views dry


【解决方案1】:

你给这个方法命名是错误的。 为什么要在方法名中加上“=”号?

您应该只在控制器中调用此代码,并且在视图中只渲染结果。 这种方法最好的地方是助手。

def get_person_name_by_id(id)
  Person.find_by_id(id).name || nil
end

【讨论】:

  • 谢谢,工作正常,当我过去尝试这个时,“=”停止工作
【解决方案2】:

试试 application_controller.rb

【讨论】:

  • 我做到了,但是“=”符号阻止了它的工作,请参见下面的答案
【解决方案3】:

Rider 类上的方法如何只返回名称?

def name
   person = Person.find_by_id( @person_id )
   if !person.nil?
      return person.name
   end
   return nil
end

用作

<%= rider.name %>

或者,您可以在 Person 类上使用静态/类方法。

 def Person.get_name( rider )
     if !rider.nil?
       person = find_by_id( rider.person_id )
       if !person.nil?
          return person.name
       end
     end
     return nil
 end

称为

 <%= Person.get_name( rider ) %>

请注意,我在视图代码中删除了对 id 的引用。

【讨论】:

    【解决方案4】:

    Rails 是关于约定优于配置的。除非被覆盖,否则它的所有辅助方法都假定最常见的选项。但是 ActiveRecord 模型没有有用的默认 to_s。

    指定默认动作:

    class Person < ActiveRecord::Base
      def to_s
        name
      end
    end
    

    现在,每次您尝试在字符串上下文中评估人员实例时,您都会得到一个名称。

    所以

    <%= Person.find_by_id(rider.person_id).name %>
    

    现在可以替换为

    <%= rider.person %>
    

    对于其他任何内容,您都可以指定字段和方法。

    【讨论】:

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