2013-02-07 13 views
5

W ciągu ostatnich kilku dni miałem problem z uzyskiwaniem zagnieżdżonych zasobów do prawidłowego tworzenia i wyświetlania. Istnieje mnóstwo podobnych pytań na temat StackOverflow i wielu blogów na ten temat, ale wszystkie wydają się albo radzić sobie ze starszą wersją Railsów, albo z innym problemem. Jestem w punkcie, w którym kiedyś coś naprawiłem, pojawia się kolejny błąd. Zawęziłem to do mnie, popełniając głupi błąd lub literówkę będąc zbyt niedoświadczonym, by to zauważyć.Routing zagnieżdżonych zasobów i dopasowywanie kontrolera

Mam model Jobs, który należy do modelu Venue. Miejsce działa dobrze i udało mi się nawet dotrzeć do mojego zagnieżdżonego indeksu miejsc pracy w każdym miejscu i wyświetlić formularze Nowe i Edytować, ale przejście do "Pokaż" lub utworzenie nowego zadania spowodowało błąd undefined method . Po wielu poszukiwaniach znalazłem wiele z tym samym problemem i próbowałem implementować ich poprawki, ale teraz dostaję błąd routingu.

Większość mojego mylącego pochodzi od tego, kiedy odejść od @, kiedy używać: venue_id zamiast: id w parametrach, itp. Każdy przykład, który widzę, wydaje się mieć inny sposób i nie mogę wydawać się z nich pracuje dla mnie.

Każdy guz we właściwym kierunku byłby niezwykle pomocny.

Routing błąd

No route matches {:action=>"show", :controller=>"jobs", :venue_id=>#<Venue id: 1, name: "Burger Chef", city: "Chicago", state: "Illinois", areacode: 60614, created_at: "2013-02-05 21:33:41", updated_at: "2013-02-06 23:01:05", avatar_file_name: nil, avatar_content_type: nil, avatar_file_size: nil, avatar_updated_at: nil>} 

routes.rb

Twist::Application.routes.draw do 


    resources :users 
    devise_for :users 

    resources :venues do 
    resources :jobs 
    end 

end 

jobs_controller.rb

class JobsController < ApplicationController 
    # GET /jobs 
    # GET /jobs.json 
    before_filter :get_venue 

    def get_venue 
    @venue = Venue.find(params[:venue_id]) 
    end 

    def index 
    @jobs = @venue.jobs 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @jobs } 
    end 
    end 

    # GET /jobs/1 
    # GET /jobs/1.json 
    def show 
    @job = @venue.job.find(params[:id]) 

    if params[:id] 
     @venue = Venue.where(:id => params[:id]).first 
     @jobs = @venue.job_url 
    else 
     @jobs = Jobs.all 
    end 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @job } 
    end 
    end 

    # GET /jobs/new 
    # GET /jobs/new.json 
    def new 
    @job = @venue.jobs.build 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @job } 
    end 
    end 

    # GET /jobs/1/edit 
    def edit 
    @job = @venue.job.find(params[:venue_id]) 


    end 

    # POST /jobs 
    # POST /jobs.json 
    def create 
    @job = @venue.jobs.new(params[:job]) 

    respond_to do |format| 
     if @job.save 


     format.html { redirect_to :action => :show, :id => @venue.id, 
         notice: 'Job was successfully created.' } 
     format.json { render json: [@venue, @job], 
          status: :created, 
          location: [@venue, @job] } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @job.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /jobs/1 
    # PUT /jobs/1.json 
    def update 
    @job = Job.find(params[:id]) 

    respond_to do |format| 
     if @job.update_attributes(params[:job]) 
     format.html { redirect_to @job, notice: 'Job was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @job.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /jobs/1 
    # DELETE /jobs/1.json 
    def destroy 
    @job = Job.find(params[:id]) 
    @job.destroy 

    respond_to do |format| 
     format.html { redirect_to jobs_url } 
     format.json { head :no_content } 
    end 
    end 
end 

venues_controller.rb

class VenuesController < ApplicationController 
    # GET /venues 
    # GET /venues.json 


    def index 
    @venues = Venue.all 

    if params[:name] 
     @user = User.where(:name => params[:name]).first 
     @venues = @user.venues 
    end 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @venues } 
    end 
    end 

    # GET /venues/1 
    # GET /venues/1.json 
    def show 
    @venue = Venue.find(params[:id]) 


    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @venue } 
    end 
    end 

    # GET /venues/new 
    # GET /venues/new.json 
    def new 
    @venue = Venue.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @venue } 
    end 
    end 

    # GET /venues/1/edit 
    def edit 
    @venue = Venue.find(params[:id]) 

    #if session[:user_id] != @venue.user_id 
    # flash[:notice] = "Sorry, you cannot edit this venue." 
    # redirect_to(venues_path) 
    # =>end 
    end 

    # POST /venues 
    # POST /venues.json 
    def create 
    @venue = Venue.new(params[:venue_id]) 


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

    # PUT /venues/1 
    # PUT /venues/1.json 
    def update 
    @venue = Venue.find(params[:id]) 

    respond_to do |format| 
     if @venue.update_attributes(params[:venue]) 
     format.html { redirect_to @venue, notice: 'Venue was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @venue.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /venues/1 
    # DELETE /venues/1.json 
    def destroy 
    @venue = Venue.find(params[:id]) 
    @venue.destroy 

    respond_to do |format| 
     format.html { redirect_to venues_url } 
     format.json { head :no_content } 
    end 
    end 
end 

job.rb

class Job < ActiveRecord::Base 
    attr_accessible :description, :name, :requirement, :venue_id 

    validates :name, :presence => true, :length => { :minimum => 3 } 

    belongs_to :venue 
end 

venue.rb

class Venue < ActiveRecord::Base 
    attr_accessible :areacode, :avatar, :city, :name, :state 


    has_many :jobs 

    has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" } 

end 

/jobs/show.html.erb

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


    <% @job = Job.find(param[:venue_id]) %> 

    <p> 
     <b>Name:</b> 
     <%= @job.name %> 
    </p> 

    <p> 
     <b>Company:</b> 
     <p><%= @venue.name %></p> 
     <p><%= link_to @job.venue.name, venue_path(@venue) %></p> 


    <p> 
     <b>Job:</b> 
     <%= @job.job_id %> 
    </p> 

    <p> 
     <b>Description:</b> 
     <%= @job.description %> 
    </p> 

    <p> 
     <b>Requirement:</b> 
     <%= @job.requirement %> 
    </p> 




    <%= link_to 'Edit', edit_venue_job_path(@venue, @job) %> | 
    <%= link_to 'Back', venue_jobs_path(@venue, @job) %> 

**/jobs/index.html.erb** 

<div class="usergrid"> 

    <% jobs = @venue.jobs %> 


    <% @venue.jobs.each do |job| %> 
<div class = "user venue"> 

    <p> 
     <h2><%= link_to job.name, venue_job_path(@venue) %></h2> 
     <%= link_to 'Edit', edit_venue_job_path(@venue, job) %><br/> 
     <%= link_to 'Delete', venue_jobs_path(@venue, @job), :confirm => 'Are you sure?', :method => :delete %> 
</div> 
<% end %> 
<div style="clear:both"></div> 
</div> 




<%= link_to 'New Job', new_venue_job_path(@venue) %> 

Zdaję sobie sprawę, że ...

  1. To może być naprawdę oczywisty dylemat, ale jest nowy w Rails na pewno są jeszcze pewne podstawy, że nie w pełni rozumieją.
  2. Jeśli wysłałem za dużo lub za mało kodu, proszę dać mi znać, nie jestem do końca pewien, ile jest to najmniej niezbędne.
  3. Może być więcej niż jeden błąd, może być wiele błędów, a wiele z nich mogło być spowodowane przez próbę naprawienia tego, gdy naprawdę nie wiedziałem, co robię. Chciałem to naprawić sam, ale nie mogę już z tym poradzić, kiedy po prostu pogarszam.

Próbowałem mieszać z trasami, zmieniając rzeczywiste linki i trasy, mieszając z zasięgiem i tak wiele typowych poprawek dla tych błędów, które mogłem znaleźć i żadne z nich nie pomagało.

Dzięki!

+0

Czy można dołączyć więcej śledzenia stosu? Wygląda na to, że przekazujesz swój model zamiast swojego id_modelu do swoich tras. – drewinglis

+0

@drewinglis nie powinno to stanowić problemu, jak gdyby url_helper otrzymywał instancję, gdy spodziewa się identyfikatora, spróbuje wywołać '# to_param', który domyślnie dla obiektów AR zwraca identyfikator – pjam

Odpowiedz

7

Błąd mówi, że nie ma trasy dla podanych params:

{:action=>"show", :controller=>"jobs", :venue_id=> "an_id"} 

można sprawdzić, uruchamiając trasy natarcia, a zobaczysz, że w pracy jest zagnieżdżony pod sali koncertowej, jobs#show Działania kontrolera wymagają dwóch parametrów: venue_id (który jest rodzicielskim zadaniem) i id, który jest identyfikatorem zadania.

szybko sprawdził swój kod i myślę, że jeden jedna z rzeczy, która powoduje błąd jest ten wiersz:

<h2><%= link_to job.name, venue_job_path(@venue) %></h2> 

powinno być

<h2><%= link_to job.name, venue_job_path(@venue, @job) %></h2> 

Zasadniczo dostaniesz że rodzaj błędu, gdy spróbujesz wyrenderować link do pracy bez podania miejsca.

Daj mi znać, jeśli potrzebujesz więcej informacji lub więcej informacji.

+0

Mój problem okazał się być trochę bardziej zawiłe to, ponieważ mój kod był tak zawalony, ale zdecydowanie poprowadziłeś mnie we właściwym kierunku, więc dziękuję! – Jason

+0

cieszę się, że pomogło ci to, chociaż nie była to idealna odpowiedź wtedy :) – pjam

+0

Twoja wskazówka na temat "venue_job_path (@venue, @job)" pomogła mi zreorganizować tę część mojego kodu. Dzięki! –

Powiązane problemy