Rails Association将form_for放在一个块中

时间:2012-06-07 20:05:48

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

我尝试做的是能够添加备注并将它们与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.

这是我需要进入的方向吗?

1 个答案:

答案 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上看到与调用方法相关的错误时,这表示某些内容未正确加载,因此您应该追踪该丢失的对象。