2013-02-07 3 views
5

Negli ultimi giorni ho avuto un problema nel far sì che le risorse nidificate vengano create e visualizzate correttamente. Ci sono tonnellate di domande simili su StackOverflow e molti post del blog su questo argomento, ma sembra che entrambi abbiano a che fare con una versione precedente di Rails o con un altro problema. Sono al punto in cui, una volta finalmente sistemato qualcosa, si apre un altro errore. L'ho ristretto a me facendo un errore stupido o errore di battitura troppo inesperto da notare.Routing di risorse nidificate e controller corrispondente

Ho un modello di lavoro che appartiene a un modello di Venue. La sede funziona bene e sono persino arrivato al punto di essere in grado di andare al mio indice Lavori nidificati sotto ogni Sede e di visualizzare i moduli Nuovo e Modifica, ma andare a "Mostra" o creare un nuovo Lavoro ha causato un errore undefined method . Dopo un sacco di ricerche ho trovato molte cose con lo stesso problema e ho cercato di implementare le loro correzioni, ma ora sto ricevendo un errore di routing.

La maggior parte della mia confusione deriva da quando lasciare @, quando utilizzare: venue_id invece di: id in params, ecc. Ogni esempio che vedo sembra avere un modo diverso e non riesco a creare alcun di loro lavorano per me.

Qualsiasi urto nella giusta direzione sarebbe estremamente utile.

L'errore di routing

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) %> 

mi rendo conto che ...

  1. Questa potrebbe essere una correzione davvero evidente, ma essendo nuovo Rails ci sono sicuramente ancora alcuni fondamenti che non ho del tutto capito.
  2. Se ho postato un numero troppo piccolo o troppo piccolo, fatemelo sapere, non sono del tutto sicuro di quanto sia il minimo necessario per questo.
  3. Potrebbe esserci più di un errore, potrebbero esserci molti errori, e molti di loro potrebbero essere stati causati da me che cercavo di sistemarlo quando davvero non sapevo cosa stavo facendo. Volevo sistemarlo da solo, ma non riesco a gestirlo più quando sto peggiorando le cose.

Ho provato scherzi con i percorsi, cambiando i collegamenti reali e percorsi, scherzi con campo di applicazione, e come molte delle correzioni comuni per questi errori che ho potuto trovare e nessuno di loro sembrava di aiutare.

Grazie!

+0

È possibile includere più di uno stacktrace? Sembra che tu stia passando il tuo modello anziché il tuo model_id ai tuoi percorsi. – drewinglis

+0

@drewinglis questo non dovrebbe essere un problema, come se un url_helper riceva un'istanza quando si aspetta un id, proverà a chiamare '# to_param' che per impostazione predefinita per gli oggetti AR restituisce l'id – pjam

risposta

7

L'errore sta dicendo che non v'è alcun percorso per i params dato:

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

È possibile verificare che eseguendo percorsi rake, e vedrete che, come i lavori sono annidati sotto sede, il jobs#show le azioni del controller richiedono due parametri: lo venue_id (che è il "genitore" del lavoro) e lo id, che è l'ID del lavoro.

ho subito controllato il codice, e penso che uno una delle cose che causa l'errore è questa linea:

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

questo dovrebbe essere

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

In pratica si otterrà che tipo di errore, ogni volta che proverai a rendere un link a un lavoro senza fornire la sede.

Fatemi sapere se avete bisogno di maggiori dettagli o maggiori informazioni.

+0

Il mio problema è stato un po 'più contorto di quello perché il mio codice era così incasinato, ma tu mi hai sicuramente portato nella giusta direzione, quindi grazie! – Jason

+0

contento che ti abbia aiutato anche se non era la risposta perfetta :) – pjam

+0

Il tuo suggerimento su "venue_job_path (@venue, @job)" mi ha aiutato a rifattorizzare quella parte del mio codice. Grazie! –