我尝试做的是能够添加备注并将它们与Rails中的客户端关联。
我的客户端模型如下所示:
class Client < ActiveRecord::Base
attr_accessible :company_name, :contact_name, :email_address, :phone_number,
:street_address, :city, :state, :zip
has_many :notes, dependent: :destroy
end
我的笔记模型看起来像这样:
class Note < ActiveRecord::Base
attr_accessible :content
belongs_to :client
default_scope order: 'notes.created_at DESC'
validates :client_id, presence: true
end
我的客户端的index.html.erb如下所示:
<% @clients.each do |client| %>
.
.
.
<%= form_for(@notes) do |f| %>
<%= f.text_area :content, placeholder: "Compose new note..." %>
<%= f.submit "Add Note", class: "buttonPri addnote" %>
<% end %>
<% end %>
在我的客户控制器中我有:
def index
if signed_in?
@clients = Client.all
@note = client.notes.build
else
redirect_to signin_path
end
end
在我的笔记控制器中:
def create
@note = client.notes.build(params[:note])
if @note.save
flash[:success] = "Note Created"
redirect_to root_path
else
render 'static_pages/home'
end
end
加载客户端索引页面时出现undefined local variable or method client for #<ClientsController:0x007f835191ed18>
错误。我认为正在发生的是控制器无法看到块变量client
,我需要将它移出控制器并进入form_for。这是正确的方法,我该怎么做?
我正在浏览rails API,发现了这个:
<%= form_for([@document, @comment]) do |f| %>
...
<% end %>
Where @document = Document.find(params[:id]) and @comment = Comment.new.
这是我需要进入的方向吗?
答案 0 :(得分:2)
问题是你在控制器中指的是client
但是没有定义。
根据您的示例:
def create
@note = client.notes.build(params[:note])
if @note.save
flash[:success] = "Note Created"
redirect_to root_path
else
render 'static_pages/home'
end
end
client
应该来自哪里?通常它由before_filter
调用中的父控制器类加载,通常看起来像:
before_filter :load_client
def load_client
@client = Client.find_by_id!(params[:client_id])
end
可能是您定义的client
方法正在返回nil
,因为它无法找到某些内容。在这种情况下,您应该追踪它,看看问题是什么。这就是使用find!
抛出异常而不是悄然失败的地方通常是更好的方法。
当您在nil
上看到与调用方法相关的错误时,这表示某些内容未正确加载,因此您应该追踪该丢失的对象。