2016-10-18 9 views
0

안녕하세요 두 가지 모델 시설과 나는만들기 모델 관계/중첩의 resourses

class Establishment < ApplicationRecord 
    has_many :open_closed 
end 

class OpenClosed < ApplicationRecord 
    belongs_to :establishment 
end 

을 추가 한 나는 테이블을 open_closed하는 establishment_id 필드를 추가 한 후 레일 DB를 실행 한 OpenClosed 사이의 관계를 만들기 위해 노력하고 있어요 : migrate.Next를 나는 내가 새로운 코드

def new 
@establishment = Establishment.find(params[:establishment_id]) #new line added 
@open_closed = OpenClosed.new 
end 

# GET /open_closeds/1/edit 
def edit 
end 

# POST /open_closeds 
# POST /open_closeds.json 
def create 
@establishment = Establishment.find(params[:establishment_id]) #new line added 
@open_closed = OpenClosed.new(open_closed_params) 
@open_closed.Establishment = @establishments #new line added 

respond_to do |format| 
    if @open_closed.save 
    format.html { redirect_to @open_closed, notice: 'Open closed was  successfully created.' } 
    format.json { render :show, status: :created, location: @open_closed } 
    else 
    format.html { render :new } 
    format.json { render json: @open_closed.errors, status: :unprocessable_entity } 
    end 
end 
end 
추가 한 OpenClosed 컨트롤러 #new 줄 주석을 수정 한 다음 자원

resources :establishments do 
    resources :open_closeds 
end 

을 중첩 한

open_closed보기에서 양식을 제출할 때 발생하는 오류입니다.

정의되지 않은 메소드 # Establishment = 'for # 의미가 있습니까? 설립 = 설립 설립 _id = 설립 _ 설립 _ id?

내 인생에서 내가 어디에서 잘못 될지 생각해 보면 누군가가 올바른 방향으로 나에게 미리 감사를드립니다.

+0

OpenClosed 란 무엇입니까?[업무 시간] (https://en.wikipedia.org/wiki/Business_hours)과 같은 것을 의미합니까? – max

답변

0

먼저, 다음과 같이 할 수 OpenClosed#new 조치를 재 작성 :

<h1>New Open Closed</h1> 

<%= render 'form', establishment: @establishment, open_closed: @open_closed %> 
<%= link_to 'Back', establishment_open_closeds_path %> 

이 우리가 지금 의미 Establishment 개체와 OpenClosed 개체를 부분 양식에 전달합니다.

다음, 다음과 같이 할

`app/views/open_closeds/_form.html.erb` 

에서 <%= form_for ... %> 선언을 변경 : 우리는 단지 EstablishmentOpenClosed 객체를 모두 사용하는 우리의 양식을 말 했어요

<%= form_for [establishment, open_closed] do |f| %> 

.

다음과 같이 할 open_closed 제어기를 다시 :

@open_closed.Establishment = @establishments 

@open_closed.establishment = @establishment 

하는 라인을 변경 : I이었다 이루어

def create 
    @establishment = Establishment.find(params[:establishment_id]) 
    @open_closed = OpenClosed.new(open_closed_params) 
    @open_closed.Establishment = @establishment #new line added 

    respond_to do |format| 
    if @open_closed.save 
     format.html { redirect_to [@establishment, @open_closed], notice: 'Open closed was successfully created.' } 
     format.json { render :show, status: :created, location: @open_closed } 
    else 
     format.html { render :new } 
     format.json { render json: @open_closed.errors, status: :unprocessable_entity } 
    end 
    end 
end 

두 수정

이제는 'e'가 소문자로 바뀌었고 's'는 줄 끝에서 제거되었습니다 (아마도 오타 였을 것입니다). 당신이 당신의 db/schema.rb 파일을 보면, 당신은 open_closeds 테이블 아래

t.integer "establishment_id" 

을 볼 수 있습니다. ActiveRecord에서는 데이터베이스 테이블의 행과 동일한 이름을 사용하여 클래스의 메서드에 액세스합니다. 그러나 establishment_id과 같은 외래 키의 경우 레일은 @open_closed.establishment이라고 말하면 실제로 OpenClosed 개체에 속한 Establishment을 원한다는 것을 알기에 충분히 똑똑합니다.

redirect_to [@establishment, @open_closed] ...  

당신은 경로가 유효하기 위해서는 설립과 open_closed 객체를 모두 제공해야합니다

나는 위의 코드 변경 두 번째 것은

이 라인입니다. redirect 문이 OpenClosed 클래스의 show 메소드를 보내므로, 레이크 라우트를 실행하여 OpenClosed#show의 경로가 어떻게 보이는지 확인할 수 있습니다. 나는 당신의 경로 파일을 rake routes을 실행하고 그래서 당신은 OpenClosed#show가 설립 객체와 OpenClosed 객체 모두를 기대하고 있음을 알 수
establishment_open_closed GET /establishments/:establishment_id/open_closeds/:id(.:format)  open_closeds#show 

OpenClosed

의 표시 방법이있어. 당신은 단순히 첫 번째 매개 변수로 배열 오브젝트를 모두 제공해야 redirect_to

참고 :

응용 프로그램의 루트의 많은 잘못과해야하기 때문에 당신이 때 당신은 가능성이 여전히 오류가 발생합니다 변경되었습니다.

<p id="notice"><%= notice %></p> 

<%= link_to 'Edit', edit_establishment_open_closed_path(@open_closed) %> | 
<%= link_to 'Back', establishment_open_closeds_path %> 

으로 예를 들어, 실제로, 당신은 OpenClosed 컨트롤러의 쇼 템플릿에 다음과 같은 수정을해야합니다 (당신이 OpenClosed#create에 성공적으로 호출 한 후 리디렉션있는 경우 임) OpenClosed#show보기를 렌더링 미래를위한 팁으로, 파일에

<%= debug(params) if Rails.env.development? %>을 수확 후 바로 추가 할 수 있습니다. 이렇게하면 디버깅 할 때 유용 할 수있는 서버 응답 정보가 출력됩니다.

마지막으로 라우트를 수정해야만 작동하는 다른 부분의 응용 프로그램이있을 것입니다. 그러나 지금은 그렇게할만한 충분한 정보가 있으면 잘만 될 것입니다.

중첩 된 경로에 대한 자세한 내용은

, 코딩 Happing official rails guids

를 체크 아웃!

+0

정말 유익한 답변을 해주셔서 감사합니다. 내 노선을 정리하는 데 두 시간을 소비 한 후, 귀하의 조언에 감사드립니다. 좋은 학습 곡선 건배. – mfz6

+0

좋아요! 다행히 도울 수있어 :) – Mark

0

당신은 그런 식으로 코드를 변경해야합니다

@open_closed = @establishment.open_closeds.new(open_closed_params) 

그래서 당신을 위해 @의 open_closed.establishment_id을 할당 할 수 있습니다.

has_many :open_closedhas_many :open_closeds으로 변경해야하는 것 같습니다.

0
@open_closed.Establishment = @establishments #new line added 

이것은 실패한 행입니다. 다음과 같아야합니다.

@open_closed.establishment = @establishment #new line added 

대문자 사용은 중요합니다. 연관된 객체는 절대 대문자로 시작하지 않습니다 - 대문자는 클래스 이름 (예 : Establishment 모델을 정의 할 때) 또는 상수 (여기에서 사용하지 않음)를위한 것입니다.

또한 당신이 오타를주의 ->@establishment 복수하지 않습니다 (단 하나있다) :

+0

클래스 이름은 상수 – max

+0

이지만 ALL_SHOUTY_CONSTANTS와는 다릅니다 :) 자신의 클래스 (hehe)에 있습니다 –

+0

루비는 ALLCAPS와 CamelCase를 구별하지 않습니다. 대문자로 시작하는 한 상수입니다. '클래스 Foo; end'는 실제로'Foo = Class.new'의 문법적 설탕입니다. 클래스 'LIKE_BACK_WHEN_FORTRAN_WAS_THE_BEES_KNEES = Class.new'를 선언 할 수는 있지만, 워터 쿨러 뒤에 타르 닝과 페더 링 및 비눗물 정리가 발생할 수 있습니다. – max