2

У меня есть три модели:Rails 4: ActionController :: UrlGenerationError

class User < ActiveRecord::Base 
    has_many :administrations 
    has_many :calendars, through: :administrations 
end 

class Calendar < ActiveRecord::Base 
    has_many :administrations 
    has_many :users, through: :administrations 
end 

class Administration < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :calendar 
end 

А вот мои маршруты:

resources :users do 
    resources :administrations 
    resources :calendars 
end 

-----------

ОБНОВЛЕНИЕ:

Вот что я получаю, когда я запускаю rake routes в Терминале:

Prefix Verb URI Pattern          Controller#Action 
    user_administrations GET /users/:user_id/administrations(.:format)   administrations#index 
         POST /users/:user_id/administrations(.:format)   administrations#create 
new_user_administration GET /users/:user_id/administrations/new(.:format)  administrations#new 
edit_user_administration GET /users/:user_id/administrations/:id/edit(.:format) administrations#edit 
    user_administration GET /users/:user_id/administrations/:id(.:format)  administrations#show 
         PATCH /users/:user_id/administrations/:id(.:format)  administrations#update 
         PUT /users/:user_id/administrations/:id(.:format)  administrations#update 
         DELETE /users/:user_id/administrations/:id(.:format)  administrations#destroy 
      user_calendars GET /users/:user_id/calendars(.:format)    calendars#index 
         POST /users/:user_id/calendars(.:format)    calendars#create 
     new_user_calendar GET /users/:user_id/calendars/new(.:format)   calendars#new 
     edit_user_calendar GET /users/:user_id/calendars/:id/edit(.:format)  calendars#edit 
      user_calendar GET /users/:user_id/calendars/:id(.:format)   calendars#show 
         PATCH /users/:user_id/calendars/:id(.:format)   calendars#update 
         PUT /users/:user_id/calendars/:id(.:format)   calendars#update 
         DELETE /users/:user_id/calendars/:id(.:format)   calendars#destroy 
        users GET /users(.:format)         users#index 
         POST /users(.:format)         users#create 
       new_user GET /users/new(.:format)        users#new 
       edit_user GET /users/:id/edit(.:format)       users#edit 
        user GET /users/:id(.:format)        users#show 
         PATCH /users/:id(.:format)        users#update 
         PUT /users/:id(.:format)        users#update 
         DELETE /users/:id(.:format)        users#destroy 
        root GET /            static_pages#home 

-----------

UPDATE 2:

Вот мой calendars_controller.rb файл:

class CalendarsController < ApplicationController 
    before_action :set_calendar, only: [:show, :edit, :update, :destroy] 

    # GET /calendars 
    # GET /calendars.json 
    def index 
    @calendars = Calendar.all 
    end 

    # GET /calendars/1 
    # GET /calendars/1.json 
    def show 
    end 

    # GET /calendars/new 
    def new 
    @user = User.find(params[:user_id]) 
    @calendar = @user.calendars.new 
    end 

    # GET /calendars/1/edit 
    def edit 
    @user = User.find(params[:user_id]) 
    @calendar = @user.calendar.find(params[:calendar_id]) 
    end 

    # POST /calendars 
    # POST /calendars.json 
    def create 
    @user = User.find(params[:user_id]) 
    @calendar = @user.calendars.new(calendar_params) 

    respond_to do |format| 
     if @calendar.save 
     format.html { redirect_to user_calendar_path(@user,@calendar), notice: 'Calendar was successfully created.' } 
     format.json { render :show, status: :created, location: @calendar } 
     else 
     format.html { render :new } 
     format.json { render json: @calendar.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /calendars/1 
    # PATCH/PUT /calendars/1.json 
    def update 
    respond_to do |format| 
     if @calendar.update(calendar_params) 
     format.html { redirect_to @calendar, notice: 'Calendar was successfully updated.' } 
     format.json { render :show, status: :ok, location: @calendar } 
     else 
     format.html { render :edit } 
     format.json { render json: @calendar.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /calendars/1 
    # DELETE /calendars/1.json 
    def destroy 
    @calendar.destroy 
    respond_to do |format| 
     format.html { redirect_to calendars_url, notice: 'Calendar was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_calendar 
     @calendar = Calendar.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def calendar_params 
     params.require(:calendar).permit(:name) 
    end 
end 

- ---------

http://localhost:3000/users/1/calendars/new и http://localhost:3000/users/1/calendars/1 работа хорошо.

Но всякий раз, когда я пытаюсь получить доступ к http://localhost:3000/users/1/calendars, я получаю следующее сообщение об ошибке:

ActionController::UrlGenerationError in Calendars#index 
Showing /Users/TXC/code/rails/calendy/app/views/calendars/index.html.erb where line #17 raised: 

No route matches {:action=>"show", :controller=>"calendars", :id=>nil, :user_id=>nil} missing required keys: [:id, :user_id] 
Extracted source (around line #17): 

     <tr> 
     <td><%= calendar.name %></td> 
     <td><%= link_to 'Show', user_calendar_path(@user, @calendar) %></td> 
     <td><%= link_to 'Edit', edit_user_calendar_path(@user, @calendar) %></td> 
     <td><%= link_to 'Destroy', calendar, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
     </tr> 

В частности, я не понимаю missing required keys: [:id, :user_id] части, так как у меня есть и @user и @calendar в моем user_calendar_path.

Очевидно, что чего-то не хватает, но я не могу понять, что.

Любая идея?

+1

пост calendars_controller код пожалуйста –

+0

Конечно, просто сделал это. –

ответ

2

Проблема здесь, вы ударяете http://localhost:3000/users/1/calendars URL, который отображает на вашем calendars#index действия и правильный путь для этого это: user_calendars_path и ему нужен только один параметр user_id, так как он приведет вас на страницу индекса для пользователя и отобразит все пользовательские календари из базы данных.

Но в вашем index.html.erb зрения, у вас есть это:

<td><%= link_to 'Edit', edit_user_calendar_path(@user, @calendar) %></td> 

, которые вы не можете иметь, потому что для index действия в контроллере, вы не установили @user и @calendar. Вы можете использовать это в show.html.erb, но не в index.html.erb. Итак, вот почему вы получаете эту ошибку.

Короче, вы не можете иметь это в index.html.erb:

<td><%= link_to 'Show', user_calendar_path(@user, @calendar) %></td> 

, так как это отображается на действий и соответствующий взгляд должна быть show.html.erb НО в настоящее время у вас есть внутри index.html.erb!

Чтобы ответить на последний вопрос:

In particular, I don't understand the missing required keys: [:id, :user_id] part, since I have both @user and @calendar in my user_calendar_path.

Да, у вас есть @user и @calendar определены в контроллере НО в методе show и user_calendar_path карты к этому методы. Но эй! вы вызываете это из index.html.erb, что соответствует действию calendars#index. Это то, чего вам не хватает. Надеюсь, теперь это ясно :-)

Наконец, разница тонкая.

user_calendars_path для index вид, который показывает вам все календари для конкретного пользователя. В этом случае у вас должен быть @user, установленный в действии index в вашем контроллере.

user_calendar_path предназначен для show, который приведет вас к определенному календарю конкретного пользователя. В этом случае у вас должны быть @user и @calendar, установленные в методе show вашего контроллера.

+0

Большое спасибо за подробный ответ. Как мне обновить свой 'calendars_controller', чтобы исправить эту проблему? –

+1

Если удалить: ' <% = calendar.name%> <% = link_to 'Show', user_calendar_path (@user, @calendar)%> <% = link_to 'Edit', edit_user_calendar_path (@user, @calendar)%> <% = link_to 'Destroy', calendar, method:: delete, data: {подтвердить: «Вы уверены?» }%> 'из' index.html.erb', тогда он будет работать –

+1

В основном, это зависит от того, что вы хотите выполнить. Вы не можете использовать 'user_calendar_path' внутри' index.html.erb' –

1

Вы еще не установили @user и @calendar в свой . new действие оказывает Ваше мнение очень хорошо, но он не знает, как заполнить параметры пакета @user и @calendar

+0

Спасибо за ваш ответ. Я просто добавил '@user = User.find (params [: user_id]) @calendar = @ user.calendars.find (params [: calendar_id])' to 'calendars # show', но проблема и ошибка все еще отображаются вверх. Есть ли проблема с этим кодом? –