Ruby on rails 如何仅从代码而不是URL访问路由

Ruby on rails 如何仅从代码而不是URL访问路由,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 3.2,我看到,当我们在配置文件中命名路由时,类似于: match 'controller/posts' => 'controller#posts', :as => 'posts' 它为具有该操作的控制器创建命名路由 但是这个路径需要从代码中访问。比如说,当我从视图中单击posts按钮时,它应该为用户执行此操作 但是当有人执行www.xyz.com/posts时,它不应该尝试执行此操作。那可能吗?我不知道你为什么要这样做。听起来您想要的是能够从另一个控制器调用特定的代码位。因此,由于您

我看到,当我们在配置文件中命名路由时,类似于:

  match 'controller/posts' => 'controller#posts', :as => 'posts'
它为具有该操作的控制器创建命名路由

但是这个路径需要从代码中访问。比如说,当我从视图中单击posts按钮时,它应该为用户执行此操作


但是当有人执行www.xyz.com/posts时,它不应该尝试执行此操作。那可能吗?

我不知道你为什么要这样做。听起来您想要的是能够从另一个控制器调用特定的代码位。因此,由于您提到的原因,路由将不起作用(它将通过浏览器提供)

相反,您应该提取这段代码并将其放入它自己的库中

lib/foobar.rb:

module Foobar
  def my_method
    # add your code here
  end
end

然后,您可以在代码中的任何位置调用它。

否如果有人在浏览器中输入URL而不是单击链接,则无法设置路由并拒绝访问

听起来你想做的是防止用户猜测URL。有几个选项可以执行此操作:

  • 需要对URL进行身份验证
  • 在URL中使用难以猜测的唯一标记(/posts/1122bbbabab/1)
您可以使用进行身份验证

要使用令牌,您可以设置如下路由:

match 'controller/{some unique token here}/posts' => 'controller#posts', :as => 'posts'

请查看“设置路由约束的其他方法”。

我不是100%清楚您所说的“需要从代码访问此路由”是什么意思吗?您是否在询问如何创建一个只响应来自您以前呈现的HTML请求的控制器?您的应用程序是否已经具有身份验证和用户会话?实际上,对于POST路由,可以更进一步,例如对请求进行数字签名,和/或使用nonce,以便通过一些额外的隐藏字段,只有以前呈现的HTML表单(或其自动化)可以工作。可用于防止重复请求攻击的。不清楚OP是否会从中受益,或者问的是更基本的安全问题(您的答案解决了这些问题)。你对一个独特令牌的建议与我认为OP的要求非常接近。关于POST请求和nonce的观点很好。这可以是URL请求的一部分,方法是使用公共/私有加密生成一个在一段时间内有效的签名令牌(类似于rails生成的csrf令牌)。我会用这个更新我的答案。