如何使用哈希语法访问ruby对象的方法?

时间:2019-01-31 01:01:08

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

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

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

标记以将标题和对象属性放在数据库中(通过使用symbol变量进行访问),并获得一个不错的HTML位代码来显示我的观点。

一切正常,除了当我需要显示某些对象的属性(例如datetime属性或布尔值)时,需要调用特定对象的方法。例如,获取用户的状态。如果他已确认电子邮件,则返回字符串“ 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是用户的属性。因此,helper方法将尝试进行呼叫

@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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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") %>