2016-07-11 3 views
0

Dans mon application Web, j'ai créé deux modules; Clients et travailleurs. Mon problème est que je ne peux pas créer un lien 'Retour' depuis l'index des travailleurs vers les # clients. En d'autres termes, je veux créer cela dans l'URL:Rails 4 Routage imbriqué Retour à l'affichage des parents Page

http://localhost:3000/clients/1 

Je crois qu'il doit faire avec ne pas entrer dans l'aide à droite URL. Quand je cours des routes de rake je vois le chemin que je veux, ceci me conduit à croire que j'ai imbriqué les ressources correctement. Cependant, je ne peux pas sembler entrer le bon paramètre pour revenir à la page client # show au lieu des clients # index.

Prefix Verb URI Pattern         Controller#Action 
    client_workers GET /clients/:client_id/workers(.:format)   workers#index 
        POST /clients/:client_id/workers(.:format)   workers#create 
new_client_worker GET /clients/:client_id/workers/new(.:format)  workers#new 
edit_client_worker GET /clients/:client_id/workers/:id/edit(.:format) workers#edit 
    client_worker GET /clients/:client_id/workers/:id(.:format)  workers#show 
        PATCH /clients/:client_id/workers/:id(.:format)  workers#update 
        PUT /clients/:client_id/workers/:id(.:format)  workers#update 
        DELETE /clients/:client_id/workers/:id(.:format)  workers#destroy 
      clients GET /clients(.:format)        clients#index 
        POST /clients(.:format)        clients#create 
     new_client GET /clients/new(.:format)       clients#new 
     edit_client GET /clients/:id/edit(.:format)     clients#edit 
      client GET /clients/:id(.:format)       clients#show 
        PATCH /clients/:id(.:format)       clients#update 
        PUT /clients/:id(.:format)       clients#update 
        DELETE /clients/:id(.:format)       clients#destroy 
       root GET /           clients#index 

Dans app/views/travailleurs/show.html.erb J'ai le lien: <%= link_to 'Back', client_path(@client) %>.

contrôleur de travailleurs

class WorkersController < ApplicationController 
    before_action :set_worker, only: [:show, :edit, :update, :destroy] 

    # GET /clients/:client_id/workers 
    # GET /clients/:post_id/workers.xml 
    def index 
    #1st you retrieve the client thanks to params[:client_id] 
    client = Client.find(params[:client_id]) 
    #2nd you get all the workers of this client 
    @workers = client.workers 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @comments } 
    end 
    end 

    # GET /clients/:client_id/workers/:id 
    # GET /workers/:id.xml 
    def show 
    #1st you retrieve the client thanks to params[:client_id] 
    @client = Client.find(params[:client_id]) 
    #2nd you retrieve the comment thanks to params[:id] 
    @worker = client.workers.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @comment } 
    end 
    end 

    # GET /clients/:client_id/workers/new 
    # GET /clients/:client_id/workers/new.xml 
    def new 
    #1st you retrieve the post thanks to params[:post_id] 
    client = Client.find(params[:client_id]) 
    #2nd you build a new one 
    @worker = client.workers.build 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @comment } 
    end 
    end 

    # GET /posts/:post_id/comments/:id/edit 
    # GET /clients/:client_id/workers/:id/edit 
    def edit 
    #1st you retrieve the post thanks to params[:post_id]) 
    client = Client.find(params[:client_id]) 
    #2nd you retrieve the comment thanks to params[:id] 
    @worker = client.workers.find(params[:id]) 
    end 

    # POST /client/:client_id/workers 
    # POST /client/:client_id/worker.xml 
    def create 
    #1st you retrieve the post thanks to params[:post_id] 
    client = Client.find(params[:client_id]) 
    #2nd you create the comment with arguments in params[:comment] 
    @worker = client.workers.create(worker_params) 

    respond_to do |format| 
     if @worker.save 
     #1st argument of redirect_to is an array, in order to build the correct route to the nested resource comment 
     format.html { redirect_to([@worker.client, @worker], :notice => 'Worker was successfully created.') } 
     #the key :location is associated to an array in order to build the correct route to the nested resource comment 
     format.xml { render :xml => @worker, :status => :created, :location => [@worker.client, @worker] } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @worker.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /client/:client_id/Workers/:id 
    # PUT /client/:client_id/workers/:id.xml 
    def update 
    #1st you retrieve the post thanks to params[:post_id] 
    client = Client.find(params[:client_id]) 
    #2nd you retrieve the comment thanks to params[:id] 
    @worker = client.workers.find(params[:id]) 

    respond_to do |format| 
     if @worker.update_attributes(worker_params) 
     #1st argument of redirect_to is an array, in order to build the correct route to the nested resource comment 
     format.html { redirect_to([@worker.client, @worker], :notice => 'Worker was successfully updated.') } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @worker.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /client/:client_id/workers/1 
    # DELETE /client/:client_id/worker/1.xml 
    def destroy 
    #1st you retrieve the post thanks to params[:post_id] 
    client = Client.find(params[:client_id]) 
    #2nd you retrieve the comment thanks to params[:id] 
    @worker = client.workers.find(params[:id]) 
    @worker.destroy 

    respond_to do |format| 
     #1st argument reference the path /posts/:post_id/comments/ 
     format.html { redirect_to(client_workers_url) } 
     format.xml { head :ok } 
    end 
    end 

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

    # Never trust parameters from the scary internet, only allow the white list through. 
    def worker_params 
     params.require(:worker).permit(:first_name, :last_name, :birth_day, :birth_month, :birth_year, :birth_city, :birth_state, :client_id) 
    end 
end 
+0

Pouvez-vous publier votre 'workers_controller'? – Pavan

+0

Si vous souhaitez renvoyer '/ clients/1/workers' vers'/clients/1', vous utilisez un mauvais chemin. Vous devriez utiliser 'client_path (some_client)'. – meagar

+0

Meaga, comment est-ce que j'indique 'some_client'? Avec une variable d'instance ou un attribut id? – hp001

Répondre

1

Merci à tout le monde dans les commentaires que nous avons pu trouver . la réponse que je décide de regrouper les réponses ensemble de sorte qu'il serait plus facile pour les autres qui ont ce problème pour trouver ce post

le lien correct est:. <%= link_to 'Back', client_path(@client) %>

pour que cela fonctionne, je devais changer le WorkersController #show et #index Méthode pour les éléments suivants:

class WorkersController < ApplicationController 
def index 
    #1st you retrieve the client thanks to params[:client_id] 
    @client = Client.find(params[:client_id]) 
    #2nd you get all the workers of this client 
    @workers = @client.workers 

    respond_to do |format| 
    format.html # index.html.erb 
    format.xml { render :xml => @comments } 
    end 
end 

# GET /clients/:client_id/workers/:id 
# GET /workers/:id.xml 
def show 
    #1st you retrieve the client thanks to params[:client_id] 
    @client = Client.find(params[:client_id]) 
    #2nd you retrieve the comment thanks to params[:id] 
    @worker = client.workers.find(params[:id]) 

    respond_to do |format| 
    format.html # show.html.erb 
    format.xml { render :xml => @comment } 
    end 
end 

Essentiellement, en changeant la variable locale client en une variable d'instance @client il est donc accessible.

1

L'URL que vous voulez nécessite un :id après /clients/. Vos routes indique que le /clients/:id a le chemin comme client_path au lieu de clients_path. (client GET /clients/:id(.:format)clients#show). Donc, si vous avez cette identification dans les travailleurs # page d'index, vous pouvez l'écrire comme

<%= link_to 'Back', client_path(@client) %>. CrossCheck la syntaxe et essayer.

+1

Merci tGeek pour votre aide. – hp001

+2

Mise à jour des itinéraires selon la syntaxe correcte dans votre réponse. :) – tworitdash