0

我想要做的是能够添加注释并将它们与 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.

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

4

1 回答 1

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!which 抛出异常而不是悄悄失败通常是更好的方法的地方。

当您看到与调用方法有关nil的错误时,表明某些内容没有正确加载,因此您应该追踪丢失的对象。

于 2012-06-07T20:14:29.410 回答