设置属性未定义的方法
问题描述:
这是例子:设置属性未定义的方法
<%= 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
。
答
我认为这可能是你想要什么:
<% @clients.each do |cli| %>
<%= cli.name %>
<% end %>
其实,如果这将是你需要做的clo.send(attributo)此外,正如我在答复中提到这种沉重的意图业务逻辑可能是更好的控制器 – Kalman 2014-12-03 19:26:33
@KalmanHazins这是一个rails问题,所以这可能是一个'ActiveRecord'模型,因此将支持传递符号和字符串作为键来获取表列的值。为什么你说这是“繁重的商业逻辑”,如果它似乎是一种在视图上渲染模型的动态方法? – rafb3 2014-12-03 19:39:45
的确如此。根据你的假设 - 你是对的。否则,在你的视图(使用obj.send(:stuff))中进行元编程是非常糟糕的。那可能就是我...... – Kalman 2014-12-03 19:42:31