如何使用散列语法访问 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") %>
我正在 Rails 上 Ruby,我想为我的视图创建一个辅助方法。我必须向方法传递一个活动记录 object、一个 symbol 变量和一个标题。
这个方法的objective是取数据,创建一些和 标签把标题和object属性放在数据库上(通过访问symbol 变量)并得到一段很好的 HTML 代码放在我的视图中。 一切正常,除非我需要显示某些 object 的属性(如日期时间属性或布尔值),我需要 调用特定的 object的方法。例如,获取用户的状态 如果他已经确认了他的电子邮件,return string "Confirmed",如果没有,return string "Unconfirmed". 上面的例子不会有问题,因为:city是用户的属性。因此辅助方法将尝试进行调用 但是,如果我想获取我的用户的状态,我需要调用我的用户的 get_status 方法: 这将 return 为零,因为 :get_status 不是我的用户模型数据库上的属性:它是我的 app/models/user.rb[=17 上定义的方法=]
如何向我的用户模型添加一些代码,以便我可以将帮助程序与数据库或模型方法的属性一起使用?
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
您可以使用 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") %>