我是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字段。 谢谢你的帮助!
答案 0 :(得分:1)
如果没有看到您要处理该错误的操作,很难排除故障,但是在标题中,您应该调用 current_beekeeper 方法来获取它的返回值。
您已经有逻辑来检查养蜂人是否在显示您的标题之前已登录,因此假设 session [:beekeeper_id] 不是nil。通过调用 current_beekeeper 方法,您将能够获得当前的养蜂人对象。
如果你依赖@beekeeper实例变量,并不总是保证根据渲染你的视图的控制器动作来设置它。