2012-06-07 1 views
0

제가하려는 것은 메모를 추가하고이를 레일스의 클라이언트와 연결할 수 있습니다.Rails Association에서 form_for를 블록에 넣으십시오.

내 클라이언트 모델은 다음과 같습니다

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 

을 그리고 내 노트 모델은 다음과 같습니다

내 고객의 내 index.html.erb은 다음과 같습니다
class Note < ActiveRecord::Base 
    attr_accessible :content 
    belongs_to :client 
    default_scope order: 'notes.created_at DESC' 

    validates :client_id, presence: true 
end 

:

<% @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로 옮겨야한다는 것입니다. 이것이 올바른 접근 방식이며 어떻게해야합니까?

나는 레일 API를 통해 찾고이 발견되었다 :

<%= form_for([@document, @comment]) do |f| %> 
... 
<% end %> 
Where @document = Document.find(params[:id]) and @comment = Comment.new. 

이것이 내가 갈 필요가있는 방향을?

답변

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는 오는하도록되어? 그것은 당신이 client 방법이 뭔가를 찾을 수 없기 때문에 그 nil을 반환 정의가 될 수

before_filter :load_client 

def load_client 
    @client = Client.find_by_id!(params[:client_id]) 
end 

: 보통은 같은 일반적으로 보이는 before_filter 호출 부모 컨트롤러 클래스를로드합니다. 어떤 경우에는 문제를 추적하고 문제가 무엇인지 확인해야합니다. 여기가 조용히 실패하는 대신 예외를 던지는 find!을 사용하는 것이 종종 더 좋은 방법입니다.

nil에서 메서드 호출과 관련된 오류가 발생하면 무언가가 제대로로드되지 않았기 때문에 누락 된 개체를 추적해야합니다.

+0

클라이언트가 각 블록을 @clients 블록 변수로 지정하고 싶습니다. 그러나 그것이 가능한지 나는 모른다. 한 페이지에 여러 클라이언트가 있기 때문에 load_client 메소드가 작동하지 않으며 어떤 클라이언트가 새 노트와 연관되어 있는지 알아야합니다. –

+0

뷰에 정의 된'client' 변수는 컨트롤러와 아무런 관련이 없습니다. 이들은 완전히 다른 두 컨텍스트입니다. 사실, 변수의 범위는 일반적으로 해당 블록 내에서만 * *입니다. 여러 클라이언트에 대한 메모를 동시에 제출하는 경우이를 다르게 처리해야합니다. 표준 REST 호출은 한 번에 하나의 오브젝트에 대한 호출입니다. – tadman

+0

좋아요, 한 번에 하나씩 제출하고 싶습니다. 일종의 트위터 같아. 나는 트윗 (고객)의 목록을 가지고 있지만, 나는 그들 중 누구에게나 메모를 덧붙일 수있다. 올바른 트윗을 사용하여 올바른 답장을 얻으려면 어떻게해야합니까? –

관련 문제