设置属性未定义的方法

问题描述:

这是例子:设置属性未定义的方法

<%= atributo = "name" %> 
<% @clients.each do |cli| %> 
    <%= cli.atributo %> 
<% end %> 

错误未定义的方法 'atributo'

你调用cli对象的方法atributo。如果该对象没有该方法,那么你会得到错误。

你在这里做的是设置一个局部变量的字符串“名称”,然后遍历一些集合并调用对象上的某种方法。我不认为这就是你打算做的。我需要更多的信息来指导你正确的方向。

当您定义atributo时,它将成为一个独立变量,与任何模型无关。

当您致电cli.atributo时,试图找到与cli对象关联的atributo方法,该方法不存在。如果需要从对象访问atributo,请在模型中定义它。

实际上是试图把它打印出来,它可以把它打印出来的唯一办法是,如果有atributo

的方法尝试

<% atributo = "name" %> 

或者更好的是,设置的值attributo(如@attributo)在您的控制器中。该视图只能用于查看,而不能实际设置变量。

这不完全是Ruby的工作原理。例如:

attribute = "name" 

client = Client.first 
client.attribute # => Calls "attribute" method on client 

你想要的是动态地调用一个方法:

attribute = "name" 

client = Client.first 
client.send(attribute) # => Calls "name" method on client. 

更妙的是刚刚读你要操作的属性:

attribute = "name" 

client = Client.first 
client[attribute] # => Value of "name" attribute 

你想要什么大概是:

<% atributo = "name" %> 
<% @clients.each do |cli| %> 
    <%= clo[atributo] %> 
<% end %> 

因此您动态调用cli上的方法#name

+0

其实,如果这将是你需要做的clo.send(attributo)此外,正如我在答复中提到这种沉重的意图业务逻辑可能是更好的控制器 – Kalman 2014-12-03 19:26:33

+0

@KalmanHazins这是一个rails问题,所以这可能是一个'ActiveRecord'模型,因此将支持传递符号和字符串作为键来获取表列的值。为什么你说这是“繁重的商业逻辑”,如果它似乎是一种在视图上渲染模型的动态方法? – rafb3 2014-12-03 19:39:45

+1

的确如此。根据你的假设 - 你是对的。否则,在你的视图(使用obj.send(:stuff))中进行元编程是非常糟糕的。那可能就是我...... – Kalman 2014-12-03 19:42:31

我认为这可能是你想要什么:

<% @clients.each do |cli| %> 
    <%= cli.name %> 
<% end %>