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



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

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

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

一切都很好,除了当我需要显示某些对象的属性(如日期时间属性或布尔值)时,我需要调用特定对象的方法。例如,获取用户的状态 如果他已确认其电子邮件,则返回字符串"已确认",如果没有,则返回字符串"未确认"。

  • 帮助程序代码
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 不是我的用户模型数据库上的属性:它是在我的应用程序/模型/user.rb 上定义的方法

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

最新更新