【问题标题】:Nested resources without controller names in urlurl 中没有控制器名称的嵌套资源
【发布时间】:2010-07-07 15:07:16
【问题描述】:

我有一个非常简单的 Rails 3 应用程序,其中包含一个由 Devise 运行的用户模型和一个 Notes 模型。现在 url 和路由看起来像这样:

# url
/users/MEMBERNAME/notes/TITLE-OF-NOTE

# routing
resources :users do
  resources :notes
end

但我希望 url 看起来像这样,在这种情况下路由会是什么样子?

# url
/MEMBERNAME/TITLE-OF-NOTE

更新:

谢谢,不过现在我发现了一个新问题。在我的表格中,我有以下代码:

<%= form_for([@user, @note]) do |f| %> 

在我的控制器中,我像这样重定向:

format.html { redirect_to([@user, @note], :notice => 'Note was successfully created.') } 

在这两种情况下,当我使用@user 时,@note 旧网址仍然存在。您知道如何翻译表单和重定向以使用成员/标题结构吗?

提前致谢!

【问题讨论】:

    标签: ruby-on-rails routing device


    【解决方案1】:

    您可以在此处使用自定义路由:

    get "/:user_id/:id", :to => "notes#show", :as => :short_user_note
    

    希望这会有所帮助!

    更新:

    使用新创建的命名路由:

    # => /USER_NAME/NOTE_NAME
    redirect_to short_user_note_path(@user, @note)
    
    # => /user/USER_NAME/note/NOTE_NAME
    redirect_to user_note_path(@user, @note)
    # OR
    redirect_to url_for([@user, @note])
    # OR
    redirect_to [@user, @note]
    

    因此,一般规则是,如果您将如下所示的一组 active_record 对象传递给 #redirect_to、#url_for 或 #form_for 方法,则会在内部调用 #polymorphic_url 方法,并生成标准 RESTful 路由。

    【讨论】:

    • 谢谢,帮了我很多忙!
    【解决方案2】:

    您可以使用 Rails 3 中的工作路由助手来处理您所追求的路由行为,如下所示:

    resources :users, :path => ''
    resources :users, :path => '', :only => [] do
      resources :notes, :path => '', :except => [:index]
    end
    

    请参阅我的blog post,了解有关我如何获得此解决方案的详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多