2016-05-29 16 views
1

Subscriberモデルでは、 "phone_number"と "visit"の整数が使用されています。私は2つのコントローラSubscribersVisits(スーパーとサブ)を持っています。これまでネストされたコントローラでは一度も働いたことがなく、私は信じる名前空間にいくつか問題があります。なぜなら私は初期化されていない定数エラーを取り戻すからです。基本的に、加入者コントローラは加入者にサインアップし、訪問コントローラは、自分のphone_numberのユーザ入力によって訪れた時間をカウントする。なぜこのエラーが発生するのですか?分かりやすくするために私のコードを示します。レールのルーティングエラー - 初期化されていない定数SubscribersController

コントローラー

class Subscribers::VisitsController < ApplicationController 
    def new 
    @subscriber = Subscriber.new 
    end 

    def create 
    @subscriber = Subscriber.find_by_phone_number(params[:phone_number]) 
    if @subscriber 
    @subscriber.visit += 1 
    @subscriber.save 
    redirect_to subscribers_visits_new_path(:subscriber) 
    else 
    render "new" 
    end 
    end 
end 


    class SubscribersController < ApplicationController 
def index 
    @subscriber = Subscriber.all 
end 

def new 
    @subscriber = Subscriber.new 
end 

def create 
    @subscriber = Subscriber.create(subscriber_params) 
    if @subscriber.save 
    flash[:success] = "Subscriber Has Been successfully Created" 
    redirect_to new_subscriber_path(:subscriber) 
    else 
    render "new" 
    end 
end 

ROUTES

Rails.application.routes.draw do 
    devise_for :users 
    resources :subscribers, except: :show 
    get '/subscribers/visits/new', to: 'subscribers/visits#new' 


    root "welcomes#index" 

VIEWS

<h1>hey</hey> 

    <%= form_for @subscriber do |form| %> 
    <div class="form-group"> 
    <p> 
    <%= form.label :phone_number %> 
    <%= form.text_field :phone_number %> 
    </p> 
    <% end %> 

ERROR

enter image description here

+0

これら2つのコントローラに 'routes.rb'を貼り付けることはできますか? – kasperite

+0

あなたのためのルートを手に入れました – Bitwise

+0

Visitsコントローラの目的は何ですか?あなたはサブスクライバコントローラ内で訪問行動をしてから、「サブスクライバ#訪問」へのルートを持っていて、そこの訪問フィールドを更新できませんか? –

答えて

1

おそらく、コントローラを別のコントローラから継承する必要はありません。単純にコントローラーを定義する通常どおり:

アプリ/コントローラ/ subscribers_controller.rb

アプリ/コントローラ/ visits_controller.rbで
class SubscribersController < ApplicationController 
    # methods for Subscribers 
end 

class VisitsController < ApplicationController 
    # methods for Visits 
end 

なお、これらのを別々のファイルに配置する必要があります。そうすれば、Railsは正しいソースファイルを見つけ出すことができますのためのoking。これはRailsの命名規則です。

ルートについては、4つのルートフォーマットのいずれかを使用するように変更する必要があります。 Rails Routing from the Outside InガイドのAdding More RESTful Actionsのセクションを読むことが役立ちます。

1)あなたが実際にやろうとしている思われるものであるネストされたリソースとしてルートvisitsに、あなたはこれを使用します。

:これは、これらのルートを生成します

resources :subscribers, except: :show do 
    resources :visits 
end 

GET /subscribers/new 
POST /subscribers 
GET /subscribers 
GET /subscribers/:id/edit 
PATCH /subscribers/:id/update 
DELETE /subscribers/:id/destroy 
GET /subscribers/:id/visits/new 
POST /subscribers/:id/visits 
GET /subscribers/:id/visits 
GET /subscribers/:id/visits/:id 
GET /subscribers/:id/visits/:id/edit 
PATCH /subscribers/:id/visits/:id/update 
DELETE /subscribers/:id/visits/:id/destroy 

これは、ネストされたリソースと別のコントローラの一般的なルート構造です。

resources :subscribers, except: :show do 
    collection do 
    get 'visits/new', to 'visits#new' 
    post 'visits', to 'visits#create' 
    end 
end 

これは、これらのルートを生成します:

GET /subscribers/new 
POST /subscribers 
GET /subscribers 
GET /subscribers/:id/edit 
PATCH /subscribers/:id/update 
DELETE /subscribers/:id/destroy 
GET /subscribers/visits/new 
POST /subscribers/visits 

、あなたはおそらくこれをしたい、visits#new VisitsControllerでシンプルなコレクション(非会員)アクションを作るために

2)これは、通常、既存のリソースとコントローラに新しいトップレベルルートを追加するために使用されます。

resources :subscribers, except: :show do 
    member do 
    get 'visits/new', to 'visits#new' 
    post 'visits', to 'visits#create' 
    end 
end 

これは、これらのルートを生成します:

3)が、これは使用して、メンバーのアクションとしてvisitsを構築するために

GET /subscribers/new 
POST /subscribers 
GET /subscribers 
GET /subscribers/:id/edit 
PATCH /subscribers/:id/update 
DELETE /subscribers/:id/destroy 
GET /subscribers/:id/visits/new 
POST /subscribers/:id/visits 

これは通常、既存の新しいメンバーのルートを追加するために使用されますリソースとコントローラ。単にvisitsルートはsubscribersに含まれているように見えるようにするに

4)、あなたはこれを使用することができます

GET /subscribers/visits/new 
POST /subscribers/visits 
GET /subscribers/new 
POST /subscribers 
GET /subscribers 
GET /subscribers/:id/edit 
PATCH /subscribers/:id/update 
DELETE /subscribers/:id/destroy 

これをするために使用することができる:これは、これらのルートを生成します

get '/subscribers/visits/new', to: 'visits#new' 
post '/subscribers/visits', to: 'visits#create' 
resources :subscribers, except: :show 

既存のリソースが実際に独立している場合は、任意のルートを既存のリソースに含めるようにします。

+0

まだエラーが発生しています。あなたの助けをありがとう – Bitwise

+0

@CameronBass私は答えを更新し、使用する可能性がある別のルートのいくつかのオプションと説明を追加しました。あなたの質問を読み返してみると、あなたが本当に意味するのは、ネストされた*コントローラ*ではなく、ネストされた*ルート*が欲しいということでした。 –

2

うーん、私の推測では、あなたはこのライン変更についてどのようにVisitsControllernewアクションにルートURL subscriber/visits/newしようとしているされています

get '/subscribers/visits/new', to: 'subscribers/visits#new' 

へ:また

namespace :subscribers do 
    get '/visits/new', to: 'visits#new' 
end 

をこのブロックを移動しよう?それでもエラーが発生する場合はresources :subscribers, except: :showを超えてください。

乾杯

関連する問題