【问题标题】:RoR - add content in relation to other modelRoR - 添加与其他模型相关的内容
【发布时间】:2011-03-06 16:46:38
【问题描述】:

所以我有两个模型,每个模型都有一个控制器:

Model Project has_many Themes

Model Theme belongs_to Project

在我的路线文件中,我添加了resources :projects 以及主题。现在我可以使用localhost/projects/new 添加一个项目,它工作正常,我可以使用localhost/themes/new 添加主题。但这不是我想要的方式。

我只想添加与项目相关的主题。最好的方法是什么?我尝试过这样的事情:match "projects/:project_id/themes/new" => 'themes#new', :as => 'themes' 这似乎有效,但在提交我的新表单后没有任何反应。新表单再次呈现,没有错误消息或类似的东西。我在 html 中的表单标签呈现如下:

<form accept-charset="UTF-8" action="/projects/3/themes/new" class="new_theme" id="new_theme" method="post">

你知道哪里出了问题吗?有没有这样的最佳实践,因为我认为它是一个经常需要的模型。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 forms routing


    【解决方案1】:

    你想使用nested resources

    resources :projects do
      resources :themes
    end
    

    【讨论】:

      【解决方案2】:

      这种情况称为嵌套资源。

      在您的路线中定义:

      resources :projects do
        resources :themes
      end
      

      它将准确地创建您描述的 url,以及一堆帮助方法。有关完整列表,请参阅 the rails guides,但这里有一个示例:

      要访问单个主题,您可以使用projects_theme_path(@project, @theme),或者要查看一个项目的所有主题,您可以使用projects_themes_path(@project)。再次,请参阅 rails 指南以获取完整说明和所有帮助程序。

      此外,您可以随时运行 rake routes 来查看为您的项目设置的 EXACT 辅助方法。

      【讨论】:

      • 看起来不错! rake routes 提示也是一个不错的补充。还有一件事:我添加了这个,它工作正常。现在在我的新操作<% form_for @theme do |f| %> 中引发错误No route matches {:controller=>"themes", :action=>"create"}。我必须修改我的 form_for 操作吗?
      • 您需要使用form_for [@project, @theme] do |f|。您可能想观看此 railscast 以了解有关嵌套资源如何工作的更多信息:railscasts.com/episodes/139-nested-resources
      • 没问题,玩 Rails 玩得开心!
      【解决方案3】:

      您还应该查看https://github.com/josevalim/inherited_resources,它让建模和实现这些路由变得非常简单。

      【讨论】:

      • 使用插件代替核心 Rails 功能来完成他正在寻找的功能是多余的,对于不了解嵌套路由的初学者来说肯定不是一个好主意。在使用 gem 增加额外的复杂性之前,了解 rails 核心的工作原理很重要。
      • 我不同意。知道你的选择比不知道要好。我有谁可以假设inherited_resources 对他的特定项目来说太过分了或矫枉过正?我只是说他应该检查一下,而不是使用它。
      • 很公平,Inherited Resources 值得一看,但作为评论而不是作为答案传递一个旁注更合适。
      • 你是对的。我是 StackOverflow 的新手,所以我仍然掌握了窍门。
      猜你喜欢
      • 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
      相关资源
      最近更新 更多