2016-07-11 2 views
0

私のWebアプリケーションでは、2つのモジュールを作成しました。クライアントと労働者。私の問題は、worker#indexからclients#showへの 'Back'リンクを作成できないことです。言い換えれば、私はURLにこれを作成したいと思います:Rails 4 Nested Routing親のショーページに戻る

http://localhost:3000/clients/1 

私はそれが正しいURLヘルパーを入力しないと関係していると信じています。私がレーキルートを走らせたら、私が望む道が見えます。これは私がリソースを正しく入れ子にしたと信じさせます。しかし、私はクライアント#インデックスの代わりにクライアント#表示ページに戻るための正しいパラメータを入力するように見えることはできません。 <%= link_to 'Back', client_path(@client) %>

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で、私はのリンクを持っています。

労働者コントローラー

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

'workers_controller'を投稿できますか? – 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が/clients/:idが必要です。あなたのルートでは、/clients/:idのパスはclients_pathではなくclient_pathとなっています。あなたがその労働者の#インデックスページでそのIDを持っている場合(client GET /clients/:id(.:format)clients#show)。 だから、あなたは

<%= link_to 'Back', client_path(@client) %>としてそれを書くことができます。構文をクロスチェックしてみてください。すべての人に

+1

あなたのお手伝いをしていただきありがとうございます。 – hp001

+2

答えの正しい構文に従ってルートを更新しました。 :) – tworitdash

関連する問題