Ruby on rails RoR:更新操作。出现错误时的渲染路径
Rails项目:Ruby on rails RoR:更新操作。出现错误时的渲染路径,ruby-on-rails,validation,render,edit,Ruby On Rails,Validation,Render,Edit,Rails项目:项目有许多票证 编辑票证的路径:/projects/12/tickets/11/edit 当更新票据且验证失败时,我使用render:action=>“edit” 但是,当这次呈现编辑视图时,路径将更改为/tickets/11/ 这意味着我丢失了一些参数。我怎样才能保持原来的路径 routes.rb: resources :projects do resources :tickets end resources :tickets 票务控制器.rb def
项目
有许多票证
编辑票证的路径:/projects/12/tickets/11/edit
当更新票据且验证失败时,我使用render:action=>“edit”
但是,当这次呈现编辑视图时,路径将更改为/tickets/11/
这意味着我丢失了一些参数。我怎样才能保持原来的路径
routes.rb:
resources :projects do
resources :tickets
end
resources :tickets
票务控制器.rb
def new
@ticket = Ticket.new
end
def create
@ticket = Ticket.new(params[:ticket])
@ticket.user_id = session[:user_id]
respond_to do |format|
if @ticket.save
format.html { redirect_to project_path(@ticket.project), :notice => "Ticket was created." }
else
format.html { render :action => "new" }
end
end
end
def edit
@ticket = Ticket.find(params[:id])
end
def update
@ticket = Ticket.find(params[:id])
respond_to do |format|
if @ticket.update_attributes(params[:ticket])
format.html { redirect_to project_ticket_path(@ticket.project, @ticket), :notice => "Ticket was updated." }
else
format.html { render :action => "edit" }
end
end
end
你打了两次电话给资源部。如果您不想“丢失一些参数”,请删除第二个参数
resources :projects do
resources :tickets
end
但是,如果希望资源:票证
也是非嵌套的,可以将其限制为仅显示
和索引
,以避免在创建和编辑时丢失一些参数
resources :projects do
resources :tickets
end
resources :tickets, :only => [:index, :show]
编辑-我相信问题出在您的表单上。确保您同时拥有两个对象:
form_for([@project, @ticket]) do |f|
此外,在创建或更新票证之前,必须找到项目
。因此,您的新建
和编辑
操作必须具有以下内容:
@project = Project.find(params[:project_id])
@ticket = @project.ticket.build
@project = Project.find(params[:project_id])
@ticket = Ticket.find(params[:id])
if @ticket.update_attributes(params[:ticket])
...
对于创建
操作也一样:
@project = Project.find(params[:project_id])
@ticket = @project.ticket.build(params[:ticket])
edit2-您的更新操作应该类似于:
@project = Project.find(params[:project_id])
@ticket = @project.ticket.build
@project = Project.find(params[:project_id])
@ticket = Ticket.find(params[:id])
if @ticket.update_attributes(params[:ticket])
...
看一看。
您应该能够使用嵌套的路由帮助程序从控制器重定向到嵌套资源,例如project\u ticket\u path(@project,@ticket)
我们可以查看您的routes.rb
吗?我已经尝试过了,但在尝试更新票证时会出现错误页面:没有与[PUT]“/tickets/10”匹配的路由,我在我的表单中添加了:url=>{:action=>“update”},在视图中。现在它起作用了。然而,对于create,我将表单用作局部视图。我猜这是做不到的?我已经编辑了答案,你可以使用相同的表格(编辑和更新)。很好,这看起来很好。我只是做了一点修改:表单u for[@ticket.project,@ticket]do | f |嗯,现在当您第一次尝试更新时它似乎不起作用,出现错误,路径中的“/编辑”被切断。第二次尝试更新“/project/12/”时也会被切断。是的,但我不想在出现错误时重定向,只需重新渲染视图。视图的重新渲染与重定向到show actionNot相同。我正在用消息验证;重定向将导致新的302请求,渲染将不会。