【问题标题】:How can I access a ruby object's method by using a hash syntax? [duplicate]如何使用哈希语法访问 ruby​​ 对象的方法? [复制]
【发布时间】:2019-06-24 09:38:08
【问题描述】:

我正在研究 Ruby on Rails,我想为我的视图创建一个辅助方法。我必须将一个活动记录对象、一个 symbol 变量和一个标题传递给该方法。

此方法的目的是获取数据,创建一些

标记以将标题和对象属性放在数据库中(通过使用符号变量访问)并获得一个漂亮的 HTML 位代码放在我的视图上。

一切正常,除了当我需要显示一些对象的属性(如日期时间属性或布尔值)时,我需要调用特定对象的方法。例如,获取用户的状态 如果他已经确认了他的电子邮件,返回字符串“Confirmed”,如果没有,返回字符串“Unconfirmed”。

  • 帮助代码
module UsersHelper
    def user_show_field(user, column, title=nil)
        title ||= column.titleize
        return "<p><strong>#{title}</strong>: #{user[column]}</p>".html_safe
    end
end
  • 查看代码
<%= user_show_field(@user, :city, "City") %>

在上面的例子中,不会有问题,因为 :city 是来自用户的属性。所以辅助方法会尝试调用

@user[:city]

但是,如果我想获取我的用户的状态,我需要调用我的用户的 get_status 方法

@user[:get_status]

这将返回 nil,因为 :get_status 不是我的用户模型数据库上的属性:它是我的 app/models/user.rb 上定义的方法

class User < ApplicationRecord
    def get_status
        return registered ? "Email confirmed" : "Unconfirmed user"
    end

end

如何向我的用户模型添加一些代码,以便我可以将帮助程序与数据库或模型方法的属性一起使用?

【问题讨论】:

    标签: ruby-on-rails ruby oop methods accessor


    【解决方案1】:

    您可以使用send 调用带有符号或字符串的方法(请注意,您甚至可以使用send 调用私有方法,也可以使用public_send 代替)。

    @user.send(:get_status)
    

    如果您的方法需要参数,只需添加逗号分隔:

    @user.send(:another_method, param1, param2)
    

    https://ruby-doc.org/core-2.1.0/Object.html#method-i-public_send

    【讨论】:

    • 谢谢,这已经完成了工作。这种在ruby上调用方法的方式是如何调用的?在谷歌上搜索更多? lambda 方法?
    • Ruby 1.9.3 已经过时,APIDock 已被废弃,你最好链接到ruby-doc.org
    • @Karl,您可以阅读有关反射和元编程的信息,在维基百科上查看此示例en.wikipedia.org/wiki/Reflection_(computer_programming)#Ruby
    【解决方案2】:

    我想建议而不是发送所有字段,使用一个字符串更简单,如下所示

    module UsersHelper
      def user_show_field(user_data, title=nil)
          title ||= column.titleize
          return "<p><strong>#{title}</strong>: #{user_data}</p>".html_safe
      end
    end
    

    在这里您可以从您的视图中调用,而无需更改您的模型

       <%= user_show_field(@user.city, "City") %>
       <%= user_show_field(@user.get_status, "Status") %>
    

    【讨论】:

    • 有时简单胜于复杂,谢谢。然而,我一直对如何完成这些事情有些好奇:我一直在看模型和“before_validation :get_status”之类的东西,我想知道如何实现它。这是有机会学习它。
    猜你喜欢
    • 2011-06-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多