Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.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复杂的路由,更容易命名的路由助手_Ruby On Rails_Routing_Helper - Fatal编程技术网

Ruby on rails Rails复杂的路由,更容易命名的路由助手

Ruby on rails Rails复杂的路由,更容易命名的路由助手,ruby-on-rails,routing,helper,Ruby On Rails,Routing,Helper,我有一条命名路线,如下所示: map.with_options :path_prefix => '/:username', :controller => 'questions' do |q| q.question '/:id', :action => 'show', :conditions => { :method => :get } end 现在要生成特定问题的URL,我必须编写 question_path( :id => @question.id

我有一条命名路线,如下所示:

map.with_options :path_prefix => '/:username', :controller => 'questions' do |q|
    q.question '/:id', :action => 'show', :conditions => { :method => :get }
end
现在要生成特定问题的URL,我必须编写

question_path( :id => @question.id, :username => @question.user.username )
question_path(@question)
# or even
link_to 'Question', @question
这相当麻烦。我希望能够写作

question_path( :id => @question.id, :username => @question.user.username )
question_path(@question)
# or even
link_to 'Question', @question
并得到了预期的结果


这怎么可能?我假设我必须覆盖默认的帮助程序才能实现这一点。

这就像您希望为用户/问题创建嵌套路由一样

map.resource :users do |user|
  map.resources :question, :shallow => true
end

通过这种方式,您可以使用/users/1/questions访问用户问题,但您仍然可以访问特定问题的/questions/1。

您可以使用
question\u路径(@question.user.username,@question)

也可以编写帮助器方法:

  def user_question_path(question)
    question_path(question.user.username, question)
  end

使用
user\u question\u path(@question)

问题是,我的URL看起来像:username/:question\u id,我认为它不适用于此。您建议的解决方案是否会促进URL的生成?为什么需要这样的URL?这是客户的要求吗?如果不是,我强烈建议在rails中使用约定,在您的示例中,类似于/users/:user_id/questions/:idI希望使用这种格式,因为/users/:user_id/questions/:id太长了,我甚至在id后面显示标题slug,比如:
/john/425发生了什么事