我正在研究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") %>