在RoR中创建新的嵌套模型

时间:2015-03-25 16:42:54

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我是RoR的新手,并试图了解基础知识。我有两个型号

class Beekeeper < ActiveRecord::Base
  has_many :apiaries, dependent: :destroy 
end

class Apiary < ActiveRecord::Base
  belongs_to :beekeeper
end

Beekeepers的控制器工作得很好,但我无法通过“新”路线建立养蜂场。

蜂房控制器

class ApiariesController < ApplicationController

  def new
    @beekeeper = Beekeeper.find(params[:beekeeper_id] )
    @apiary = @beekeeper.apiaries.build
    respond_to do |format|
      format.html { render new }
    end
  end


  private

    def apiary_params
      params.require(:apiary).permit(:name, :location, :numberofbeehives, :beekeeper_id)
    end
end

同样在养蜂人控制器中我们有一个

def current_beekeeper
  @current_beekeeper ||= Beekeeper.find_by(id: session[:beekeeper_id])
end

我使用'application.html.erb'在所有页面中呈现页眉和页脚。第一个问题出在'_header.html.erb'中:

<% if logged_in? %>
  <li><%= link_to "Insert Apiary", new_beekeeper_apiary_path(@beekeeper) %></li>
  <li><%= link_to "All Beekeepers", beekeepers_path %></li>

  <li><%= link_to "Profile", beekeeper_path(@beekeeper) %></li>
  <li><%= link_to "Settings", '#' %></li>
  <li>
    <%= link_to "Log out", logout_path, method: "delete" %>
  </li>
</ul>

如果在'profile'和'new_apiary'的链接中包含(@beekeeper),我会得到:         $ No route matches {:action=>"new", :beekeeper_id=>nil, :controller=>"apiaries"} missing required keys: [:beekeeper_id] $

如果在上面的链接中我包含而不是$ @beekeeper $ - &gt; $ current_beekeeper $(或者只是current_beekeeper dunno为什么)页面加载得很好但是当我点击新的养蜂场链接时我得到(找不到养蜂人的'id'=)如果我使用$ {{ 1}} 在我的apiaries控制器或堆栈太深的错误(它在控制器的第4和第5行附近递归),如果我使用$ @beekeeper = Beekeeper.find(params[:id] ) $我认为应该工作。

忘记提及我的路线文件是

@beekeeper = Beekeeper.find(params[:beekeeper_id] )

我的apiaries db中有一个beekeeper_id字段。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

如果没有看到您要处理该错误的操作,很难排除故障,但是在标题中,您应该调用 current_beekeeper 方法来获取它的返回值。

您已经有逻辑来检查养蜂人是否在显示您的标题之前已登录,因此假设 session [:beekeeper_id] 不是nil。通过调用 current_beekeeper 方法,您将能够获得当前的养蜂人对象。

如果你依赖@beekeeper实例变量,并不总是保证根据渲染你的视图的控制器动作来设置它。