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!静かに失敗する代わりに例外をスローするを使用する方が、多くの場合、より良い方法です。

メソッドの呼び出しに関連するエラーが表示nilされた場合は、何かが正しくロードされていないことを示しているため、欠落しているオブジェクトを追跡する必要があります。

于 2012-06-07T20:14:29.410 に答える