【发布时间】:2016-11-13 19:20:03
【问题描述】:
在我的网络应用程序中,我创建了两个模块;客户和工人。我的问题是我无法创建从workers#index 到clients#show 的“返回”链接。换句话说,我想在 URL 中创建这个:
http://localhost:3000/clients/1
我认为这与未输入正确的 URL 助手有关。当我运行 rake 路由时,我看到了我想要的路径,这让我相信我已经正确地嵌套了资源。但是,我似乎无法输入正确的参数以返回 client#show 页面而不是 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
在 app/views/workers/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
【问题讨论】:
-
你能发布你的
workers_controller吗? -
如果您想从
/clients/1/workers链接回/clients/1,则说明您使用了错误的路径。你应该使用client_path(some_client)。 -
Meaga,我如何表示“some_client”?使用实例变量或 id 属性?
-
只需在
show方法中将client更改为@client并使用client_path(@client) -
您是否将
WorkersController#index中的局部变量client更改为@client(实例变量),类似于@Pavan 在#show操作中建议的内容。问题是局部变量client不会被传递给视图,而是会在您离开操作的上下文时被释放,但实例变量将被传递给视图并且可以访问您需要的路由.
标签: ruby-on-rails ruby ruby-on-rails-4 link-to nested-routes