2016-01-29 4 views
2

Я проверил все темы, которые уже, похоже, задали один и тот же вопрос, но не получили ответа. Я получаю следующую ошибку, когда пытаюсь создать нового гонщика, используя new_racer_path.ActionController :: UrlGenerationError in Racers # new

ActionController::UrlGenerationError in Racers#new 
Showing /home/dsmegha/RoR-Coursera/Mongo/raceday/app/views/racers/_form.html.erb where line #1 raised: 

No route matches {:action=>"show", :controller=>"racers", :id=>""} missing required keys: [:id] 
Extracted source (around line #1): 
1 <%= form_for(@racer) do |f| %> 
2 <% if @racer.errors.any? %> 
3 <div id="error_explanation"> 
4  <h2><%= pluralize(@racer.errors.count, "error") %> prohibited this racer from being saved:</h2> 
5 
6  <ul> 

Мои грабли маршруты выход:

$ rake routes 
    Prefix Verb URI Pattern    Controller#Action 
    racers GET /racers(.:format)   racers#index 
      POST /racers(.:format)   racers#create 
new_racer GET /racers/new(.:format)  racers#new 
edit_racer GET /racers/:id/edit(.:format) racers#edit 
    racer GET /racers/:id(.:format)  racers#show 
      PATCH /racers/:id(.:format)  racers#update 
      PUT /racers/:id(.:format)  racers#update 
      DELETE /racers/:id(.:format)  racers#destroy 
     root GET /      racers#index 

Мои контроллеры:

def show 
    end 
    def new 
    @racer = Racer.new 
    end 

    def create 
    @racer = Racer.new(racer_params) 

    respond_to do |format| 
     if @racer.save 
     format.html { redirect_to @racer, notice: 'Racer was successfully created.' } 
     format.json { render :show, status: :created, location: @racer } 
     else 
     format.html { render :new } 
     format.json { render json: @racer.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def racer_params 
     params.require(:racer).permit(:number, :first_name, :last_name, :gender, :group, :secs) 
    end 

Мой new.html.erb:

<h1>New Racer</h1> 

<%= render 'form' %> 

<%= link_to 'Back', racers_path %> 

Исходным часть _form.html .erb, который выдает ошибку.

<%= form_for(@racer) do |f| %> 
    <% if @racer.errors.any? %> 

Часть index.html.erb, откуда может быть создан новый гонщик.

<%= link_to 'New Racer', new_racer_path %> 

Я понимаю, когда новый пользователь щелкнул, новое действие в мой контроллер выполнен, создается новый гонщик и присвоения ему @racer, а затем new.html.erb визуализируется в свою очередь, создает _form. Я новичок в рельсах, и это будет здорово, если вы поможете мне отладить это.

+0

Интересно. Вы пытались передать «локальные» переменные в «_form» частично? '<% = render" form ", locals: {racer: @racer}%>' '<% = form_for racer ...' –

+0

Не могли бы вы разместить свой файл new.html.erb? Это тот, который отображается для нового действия (а не из edit.html.erb, который вы опубликовали). – rlarcombe

+0

где вы определили racer_params? Я не вижу их на контроллере.Просто спрашивайте, потому что кажется, что есть конец контроллера класса без частного раздела. – 0r4cl3

ответ

0

Я считаю, что ваша модель Racer может быть настроена неправильно.

Он должен быть определен как:

# app/models/racer.rb 
class Racer < ActiveRecord::Base 
end 

Если ваш класс Racer не наследует от ActiveRecord :: Base, он не отвечает на метод new_record?, и поэтому form_for не подберут маршрут должным образом.

+0

Я получаю «неопределенный метод' new_record? » для # "ошибка, когда я попробую это –

+0

В этом случае вы можете разместить свой racer.rb - свою модель Racer ...? Я думаю, проблема здесь в том, что вы не наследуете от ActiveRecord :: Base – rlarcombe

+0

Спасибо, выяснили мою проблему. Была функция инициализации в racer.rb для монго, и у него была ошибка при инициализации id. Работает сейчас. Спасибо :) –

0

Ok, это код для всех участвующих сторон

Форма парциальное: _form.html.erb

<%= form_for(@racer) do |f| %> 
    <% if @racer.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@racer.errors.count, "error") %> prohibited this racer from being saved:</h2> 
     <ul> 
     <% @racer.errors.full_messages.each do |message| %> 
     <li><%= message %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

Контроллер: racers_controller.rb

class RacersController < ApplicationController 
before_action :set_racer, only: [:show, :edit, :update, :destroy] 
... 
def new 
    @racer = Racer.new 
end 

@racer = Racer.new(racer_params) 

    respond_to do |format| 
    if @racer.save 
     format.html { redirect_to @racer, notice: 'Racer was successfully created.' } 
     format.json { render :show, status: :created, location: @racer } 
    else 
     format.html { render :new } 
     format.json { render json: @racer.errors, status: :unprocessable_entity } 
    end 
    end 
end 
... 
private 

def set_racer 
    @racer = Racer.find(params[:id]) 
end 

def racer_params 
    params.require(:racer).permit(:number, :first_name, :last_name, :gender, :group, :secs) 
end 

Модель: racer.rb

class Racer < ActiveRecord::Base 
end 

Маршруты: routes.rb

Rails.application.routes.draw do 
    resources :racers 
end 

Убедитесь, что для запуска rake db:migrate, а также перезапустить веб-сервер, вы никогда не знаете ...

+0

Спасибо, узнал мою проблему. Была функция инициализации в racer.rb для монго, и у него была ошибка при инициализации id. Работает сейчас. Благодаря :) –

Смежные вопросы