2016-07-11 2 views
0

В моем веб-приложении я создал два модуля; Клиенты и рабочие. Моя проблема заключается в том, что я не могу создать ссылку «Назад» от оператора # index to clients # show. Другими словами, я хочу, чтобы создать это в URL:Rails 4 Вложенная маршрутизация Вернуться к странице просмотра родителя

http://localhost:3000/clients/1 

Я считаю, что он должен делать с не ввода правильного помощника URL. Когда я запускаю маршруты рейка, я вижу путь, который я хочу, это заставляет меня думать, что я правильно вложил ресурсы. Однако я не могу указать правильный параметр, чтобы вернуться к странице # # клиента, а не по индексу клиентов # 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 

В приложение/просмотров/рабочие/show.html.erb У меня есть связь: <%= link_to 'Back', client_path(@client) %>.

Контроллер работника

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

Можете ли вы разместить свой «рабочий_контроллер»? – Pavan

+0

Если вы хотите связать ссылку '/ clients/1/workers' с'/clients/1', вы используете неправильный путь. Вы должны использовать 'client_path (some_client)'. – meagar

+0

Meaga, как я могу указать 'some_client'? С переменной экземпляра или атрибутом id? – hp001

ответ

1

Спасибо всем в комментариях, мы смогли найти . ответ, который я решил сгруппировать ответы вместе с тем, было бы легче для тех, кто имеет эту проблему, чтобы найти этот пост

правильной ссылки:. <%= link_to 'Back', client_path(@client) %>

для этой работы я должен был изменить WorkersController #show и #index метод для следующее:

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 

По сути, изменения локальной переменной client в экземпляр переменной @client так он доступен.

1

URL-адрес, который вы хотите требует :id после /clients/. Ваши маршруты говорят, что у /clients/:id есть путь как client_path вместо clients_path. (client GET /clients/:id(.:format)clients#show). Итак, если у вас есть идентификатор в этом рабочие # индексной странице, вы можете написать его как

<%= link_to 'Back', client_path(@client) %>. Перекрестный синтаксис и попробовать.

+1

Спасибо tGeek за вашу помощь. – hp001

+2

Обновлен маршрут в соответствии с правильным синтаксисом в вашем ответе. :) – tworitdash