协会:一对多关系,如何从众多关系中回归?

时间:2016-04-26 17:09:08

标签: ruby-on-rails ruby ruby-on-rails-4 redirect associations

我有一个简单的网站,我可以在这里展示食谱中的食谱。

每本食谱都有很多食谱。

我的问题:如何将用户从食谱页面链接回正确的食谱页面?如何将查看id 4食谱的用户带回id 2的食谱?

Cookbook Controller:

class CookbookController < ApplicationController
    def index
        @cookbooks = Cookbook.all
    end

    def show
    @cookbook = Cookbook.find(params[:id])
    @recipes = @cookbook.recipes
    end
end

食谱控制器:

class RecipesController < ApplicationController
  def show
    @recipe = Recipe.find(params[:id])
  end
end

食谱模型:

class Cookbook < ActiveRecord::Base
  has_many :recipes
end

食谱模型:

class Recipe < ActiveRecord::Base
  belongs_to :cookbook
end

路线:

Rails.application.routes.draw do
  get '/' => redirect('/cookbooks')

  get '/cookbooks' => 'cookbooks#index'
  get '/cookbooks/:id' => 'cookbooks#show', as: :cookbook

  get '/recipe/:id' => 'recipes#show', as: :recipe
end

到目前为止,我一直在使用:

<%= link_to "Back", :back %>

但这不是一个永久的解决方案。

我遵循了路由here上的Rails指南,我尝试了以下内容(并收到了以下错误):

<%= link_to "Back", cookbook_path(@cookbook) %>
  

没有路线匹配{:action =&gt;&#34; show&#34;,:controller =&gt;&#34; cookbooks&#34;,:id =&gt; nil}缺少必需的键:[:id]

<%= link_to "Back", cookbook_path(@cookbook.id) %>
  

未定义的方法`id&#39;为零:NilClass

其他解决方案要么引发错误/异常,要么使用配方id而不是食谱id

我还尝试允许Recipe Controller从Cookbook Controller继承,以获得食谱的id

1 个答案:

答案 0 :(得分:1)

当您尝试将Cookbook控制器与cookbook_path一起使用时,您处于正确的轨道上(没有双关语)。

每个食谱都会将其各自食谱的id与您在两个模型中定义的一对多关系存储起来。

因此,我们可以利用这个简单的link_to

<%= link_to "Back", cookbook_path(@recipe.cookbook.id) %>