我正在研究Ruby on Rails,我想为我的视图创建一个辅助方法。我必须传递一个活动记录对象,一个 symbol 变量和该方法的标题。
此方法的目的是获取数据,创建一些和 标记以将标题和对象属性放在数据库中(通过使用symbol变量进行访问),并获得一个不错的HTML位代码来显示我的观点。 一切正常,除了当我需要显示某些对象的属性(例如datetime属性或布尔值)时,需要调用特定对象的方法。例如,获取用户的状态。如果他已确认电子邮件,则返回字符串“ Confirmed”,否则,返回字符串“ Unconfirmed”。 在上面的示例中,不会有问题,因为:city是用户的属性。因此,helper方法将尝试进行呼叫 但是,如果我想获取用户的状态,则需要调用用户的 get_status方法: 这将返回nil,因为:get_status不是用户模型数据库的属性:它是在我的app / models / user.rb中定义的方法 如何向用户模型中添加一些代码,以便同时将帮助器与数据库中的属性或模型方法一起使用?
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") %>
@user[:city]
@user[:get_status]
class User < ApplicationRecord
def get_status
return registered ? "Email confirmed" : "Unconfirmed user"
end
end
答案 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") %>