在Rails中发送()可选参数的最佳方法

时间:2016-09-19 04:40:52

标签: ruby-on-rails ruby

我有一个接受两个参数的方法。其中一个是可选的。这些参数实际上是应该发送给对象的方法的名称。如果在不使用条件的情况下错过第二个参数,如何避免获取NoMethodError?我可以发送一些没有做任何事情的“空”方法吗?在我的情况下,这工作正常,但它看起来不太好。感谢。

def foo param_1, parm_2='to_s'
  object.public_send(param_1).public_send(param_2)
end

UPD 由于@Surya

,发送已更改为public_send

2 个答案:

答案 0 :(得分:3)

你可以这样使用send

object.send(:my_method, param_1, param_2)

其中my_method是为object定义的方法名称。我建议您改用public_send,因为send会让您的代码调用私有方法,这可能会导致应用程序出现意外行为。

您可以快速检查param_2是否可用:

value = param_2.nil? ? object.send(param_1.to_sym) : object.send(param_1.to_sym).send(param_2.to_sym)

答案 1 :(得分:2)

如果您使用的是Ruby 2.2.0或更高版本,则可以在任何对象上调用if ( localStorage.getItem('completed') == "true" ) { console.log('Completed'); // do something here } else { var num = (localStorage.getItem('num') == null) ? 1 : localStorage.getItem('num'); num = parseInt(num); if (num < 5) { localStorage.removeItem('num'); localStorage.setItem('num', num+1); document.getElementById('numberIn').value=num document.forms[0].submit(); } else { localStorage.setItem('completed',true); } } 并获取该对象。所以在你的例子中你可以做到

#itself

它与

相同
def foo param_1, param_2 = :itself
 object.send(param_1).send(param_2)
end

我也是第二个Surya的建议,总是使用def foo param_1, param_2 = nil thing = object.send(param_1) if param_2 thing.send(param_2) else thing end end 代替。