Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails 3中路由自定义操作_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 在Rails 3中路由自定义操作

Ruby on rails 在Rails 3中路由自定义操作,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我有一个非常简单的问题。 试图找出在rails 3中路由自定义操作的最简单方法 假设我有controlleruserscocontroller和actionpromotion\u to\u premium 也不是 都不是 http://localhost:3000/users/promote_to_premium/#{user_id} 工作 我是否应该在routes.rb中指定与new/delete/update/create/ect/…不同的每个自定义操作 谢谢。是的,您需要指定每条路线。实

我有一个非常简单的问题。 试图找出在rails 3中路由自定义操作的最简单方法

假设我有controller
userscocontroller
和action
promotion\u to\u premium

也不是

都不是

http://localhost:3000/users/promote_to_premium/#{user_id}
工作

我是否应该在routes.rb中指定与new/delete/update/create/ect/…不同的每个自定义操作


谢谢。

是的,您需要指定每条路线。实际上,您也可以使用
resource
命令定义正常路由

有一个特定的通配符命令允许访问任何操作,但它仅用于调试目的,因为它允许访问您可能不希望访问的操作:

match ':controller(/:action(/:id(.:format)))'

是的,您需要在routes.rb中指定。
例如:

通过这种方式,您可以访问以下路径:

http://localhost:3000/users/#{user_id}/promote_to_premium

您应该在routes.rb中使用此选项:

match "/users/:id/promote_to_premium" => "users#promote_to_premium"

对于控制器中的自定义方法,应在routes.rb文件中提及路由

您可以使用
获取“
匹配“=>”
发布“

当您编写get
“controller/something”
时,某些内容应该是在控制器中以“something”名称调用的操作(方法)。但是在您的情况下,您不能使用
get“controller/:id”
,因为您的控制器中没有
“:id”
方法。因此,您应该
控制器/:id
与控制器中的一些
操作
相匹配。 因此你需要写作

"match users/:id/promote_to_premium"=>  "users#promote_to_premium"
但是如果您正在向数据库中写入某些内容,那么应该使用“
post
”。不管我知道什么,我想你可以试试

match 'users/:id/promote_to_premium' => 'users#promote_to_premium', :via => :post 
您可以在以下链接中了解有关路线的更多信息:

为什么只用于调试?如果我是对的,在Rails 1.3中这样工作是不安全的,让用户像那样处理任何操作。如果您有一个需要多个参数的操作,或者类似的操作,任何人都可以通过键入controller/actiona作为url来访问该操作,该怎么办?@matzi:好的,控制器应该验证它是否以任何方式获得了正确的数据。当然,它应该这样做,但在默认情况下最好不要保留任何打开状态,试想一下,某个助手函数意外地被误认为是一个有效的操作。第二个不被接受的答案实际上回答了这个问题。
"match users/:id/promote_to_premium"=>  "users#promote_to_premium"
match 'users/:id/promote_to_premium' => 'users#promote_to_premium', :via => :post