Ruby on rails 对于rails 3.2,如何在链接_to中调用存储在字符串变量中的路径而不使用eval?

Ruby on rails 对于rails 3.2,如何在链接_to中调用存储在字符串变量中的路径而不使用eval?,ruby-on-rails,ruby,ruby-on-rails-3,link-to,Ruby On Rails,Ruby,Ruby On Rails 3,Link To,从varjobshopfqx.quote\u index\u path存储和检索报价的索引路径。以下是变量的定义方式: JobshopRfqx.quote_index_path = 'jobshop_quotex.quotes_path(:rfq_id => r.id)' 以下是可用的链接(eval): 以下是不起作用的链接: <%= link_to t('Quotes'), Rails.application.routes.url_helpers.send(JobshopRf

从var
jobshopfqx.quote\u index\u pat
h存储和检索报价的索引路径。以下是变量的定义方式:

JobshopRfqx.quote_index_path = 'jobshop_quotex.quotes_path(:rfq_id => r.id)'
以下是可用的链接(eval):


以下是不起作用的链接:

<%= link_to t('Quotes'), Rails.application.routes.url_helpers.send(JobshopRfqx.quote_index_path.to_s) %>

以下是错误:

 ActionView::Template::Error:
       undefined method `jobshop_quotex.quotes_path(:rfq_id => r.id)' for #<Module:0x42d5c90>
ActionView::Template::错误:
未定义的方法'jobshop'u quotex.quotes'u路径(:rfq\u id=>r.id)'#

如果没有eval,调用字符串路径的正确方法是什么?

如果要使用
send
,则必须将方法名与参数分开传递。你必须这样做:

Rails.application.routes.url_helpers.send('jobshop_quotex.quotes_path', :rfq_id => r.id)

但是,我不认为这会满足你的要求。我真的不明白你为什么要这么做…

我不知道你为什么要这么做,但正确的做法是使用Proc

JobshopRfqx.quote_index_path = Proc.new { |js_quotex, r| js_quotex.quotes_path(:rfq_id => r.id) }
然后,您可以通过调用以下命令来获取要查找的路径:

link_to t('Quotes'), JobshopRfqx.quote_index_path.call(jobshop_quotex, r)

我90%确信,如果需要执行上述操作,您的系统设计很糟糕。如果不了解整件事,我不能给你任何更好的建议

为什么要将其存储在字符串中?为什么不
jobshopfqx.quote\u index\u path=jobshop\u quotex.quotes\u path(:rfq\u id=>r.id)
我们只能将路径存储在字符串变量中。否则路径将在加载时进行计算。应用程序中有许多rails引擎,我们不希望在一个应用程序中使用硬编码引擎。通过将名称移动到初始值设定项文件,我们可以在安装另一个引擎时避免代码更改。啊,我明白了。在这种情况下,如果只存储方法的名称,但仍然直接传递参数,那么我建议的方法可能会起作用。不确定这是否适用于您。如果有多个参数,只需添加更多哈希作为var?是的,您可以添加更多参数。调用
send
时,第一个参数应该是要调用的方法的名称。之后的所有内容都应该是传递给该方法的正常参数。应用程序中有许多rails引擎,我们不希望在一个应用程序中使用硬编码引擎。通过将名称移动到初始值设定项文件,我们可以在安装另一个引擎时避免代码更改。在看到您的帖子之前,尝试了proc.new和call(没有传递var思想),但出现了一些错误。另外,指定jobshop“u quotex相当于硬编码我们试图摆脱的引擎名称。
link_to t('Quotes'), JobshopRfqx.quote_index_path.call(jobshop_quotex, r)