私の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
'workers_controller'を投稿できますか? – Pavan
'/ clients/1/workers'から'/clients/1'にリンクしたい場合は、間違ったパスを使用しています。 'client_path(some_client)'を使っているはずです。 – meagar
Meaga、どうすれば 'some_client'を指定できますか?インスタンス変数またはid属性を使用していますか? – hp001