【问题标题】:Clarification on accessing methods关于访问方法的说明
【发布时间】:2014-02-26 08:18:09
【问题描述】:

我无法访问我在类中编写的方法,问题是我试图在该类的实例中访问它,但希望有人能更详细地解释一下为什么这不起作用以及解决问题需要注意的事项。

我创建了一个简单的辅助方法,用于在我的视图中连接两个属性

class TeamMember < ActiveRecord::Base

  def fullname
    "#{self.forename} #{self.surname}"
  end
end

在我看来(显示动作)我希望能够使用这种方法

def show
  @team_member = TeamMember.find(params[:id])
end

例如,这样做会给我一个未定义的方法

<%= link_to fullname(@team_member) %>
OR
<% @team_member.each do |t| %>
  <%= link_to fullname, t %>
<% end %>

这行得通

<% @team_member.each do |t| %>
  <%= link_to "#{t.forename} #{t.surname}", t %>
<% end %>

有人可以帮我澄清一下,以便我可以从中学习

【问题讨论】:

  • 不是link_to fullname(@team_member) 试试这个link_to @team_member.fullname&lt;%= link_to t.fullname, t %&gt; 如果这项工作我可以回答。
  • 您将fullname 定义为无参数方法,但您正在传递参数。
  • @Monk_Code 来吧...这就是原因。
  • @Monk_Code 有效..如果你能以一种简单明了的方式解释那就太好了:) 为什么我的第一个问题是 t 的两种用途

标签: ruby ruby-on-rails-3 methods


【解决方案1】:

您在TeamMember 类中定义了fullname 方法,但您尝试在视图中使用隐式接收器调用此方法,即ActionView::Base 实例。相反,您应该使用显式接收器,它必须是 TeamMember 实例:

<%= link_to @team_member.fullname, @team_member %>

和:

<%= link_to t.fullname, t %>

【讨论】:

  • 感谢您的回答和解释。所以这里的主要问题是我试图在该类的实例中调用类方法,并且要访问该方法我需要显式使用该实例关于方法?
  • @Richlewis 的主要问题是您试图在另一个类的实例上调用实例方法。 TeamMember#fullnameTeamMember 实例方法,但您试图在 ActionView::Base 实例上调用它,而不是 TeamMember 实例(因为 ActionView::Base 实例是视图中的隐式接收器)。
  • 对不起,另一个问题......在这种情况下,ActionView::Base 实例是什么对象?
  • @Richlewis 它是您的视图代码中self 引用的对象。
猜你喜欢
  • 2014-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
相关资源
最近更新 更多