如何使用散列语法访问 ruby object 的方法?

How can I access a ruby object's method by using a hash syntax?

我正在 Rails 上 Ruby,我想为我的视图创建一个辅助方法。我必须向方法传递一个活动记录 object、一个 symbol 变量和一个标题。

这个方法的objective是取数据,创建一些

标签把标题和object属性放在数据库上(通过访问symbol 变量)并得到一段很好的 HTML 代码放在我的视图中。

一切正常,除非我需要显示某些 object 的属性(如日期时间属性或布尔值),我需要 调用特定的 object的方法。例如,获取用户的状态 如果他已经确认了他的电子邮件,return string "Confirmed",如果没有,return string "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]

这将 return 为零,因为 :get_status 不是我的用户模型数据库上的属性:它是我的 app/models/user.rb[=17 上定义的方法=]

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

end

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

您可以使用 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

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

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