2016-10-18 4 views
0

私は2つのモデル事業所とOpenClosedとの間の関係を作成しようとしていますこんにちは、私は作成モデルの関係/ネストされたresourses

class Establishment < ApplicationRecord 
    has_many :open_closed 
end 

class OpenClosed < ApplicationRecord 
    belongs_to :establishment 
end 

を追加している私は、テーブルをopen_closedするestablishment_idフィールドを追加して、レールのデシベル走っています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 =成立_成立_成立?

ここで私が間違っている場所で働くことはできません。誰かがこの1つで多くの感謝を前もって正しい方向に向けることができます。

+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 ... %>宣言を変更:

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

我々はEstablishmentOpenClosedオブジェクトの両方を使用するように私たちのフォームをちょうど言いました。

次に、このように見えるopen_closedコントローラを書き換える:

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 

Iが作られた2つの修正があった:

線を

@open_closed.establishment = @establishment 

@open_closed.Establishment = @establishments 

を変更します

施設の 'e'は小文字になっていて、行の最後に 's'を削除しました(これはおそらく単にタイプミスです)。あなたはdb/schema.rbファイルを見れば、あなたはopen_closedsテーブルの下

t.integer "establishment_id" 

が表示されるはずです。 ActiveRecordでは、データベーステーブルの行と同じ名前を使用してクラスのメソッドにアクセスします。しかし、establishment_idのような外部キーの場合、@open_closed.establishmentと言うとき、あなたのOpenClosedオブジェクトに属するEstablishmentがほしいと思うだけで十分です。

私は上記のコードで変更2つ目は、この行です:

redirect_to [@establishment, @open_closed] ...  

あなたが有効であるためにルートのために設立し、open_closedオブジェクトの両方を提供する必要があります。リダイレクトステートメントがOpenClosedクラスのshowメソッドを送信しているので、rakeルートを実行してOpenClosed#showのルートがどのようなものかを確認できます。私はあなたのルートファイルにrake routesを走り、それで、あなたはOpenClosed#showが設立オブジェクトとOpenClosedオブジェクトの両方を期待していることがわかりますOpenClosed

establishment_open_closed GET /establishments/:establishment_id/open_closeds/:id(.:format)  open_closeds#show 

のshowメソッドのためにこれを得ました。あなたは、単に最初のパラメータとして配列の両方のオブジェクトを提供する必要がredirect_to

注:

アプリケーション内のルートの多くは間違っているとする必要があるため、これをしようとすると、おそらくまだエラーになりますかわった。例えば、実際には(あなたがOpenClosed#createの呼び出しが成功した後にリダイレクトされている場所である)OpenClosed#showビューをレンダリングするために、あなたはOpenClosedコントローラのショーテンプレートに以下のように変更を加える必要があります:

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

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

として、将来のためのヒントは、あなたのapp/views/layouts/application.html.erbファイルの中に収穫直後に

<%= 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が複数でない(一つだけあります):)

+0

クラス名は定数 – max

+0

ですが、ALL_SHOUTY_CONSTANTSとは異なります:)それらは独自のクラス(hehe)です –

+0

Rubyでは、ALLCAPSとCamelCaseを区別しません。大文字で始まる限り、定数です。 'クラスFoo;実際には 'Foo = Class.new'の文法的な砂糖です。あなたはクラス 'LIKE_BACK_WHEN_FORTRAN_WAS_THE_BEES_KNEES = Class.new'を宣言することができますが、それは水のクーラーの後ろにタールリングとフェザーリングと石鹸ビートダウンをもたらすかもしれません。 – max

関連する問題