Ruby on rails RoR:更新操作。出现错误时的渲染路径

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

Rails项目:
项目
有许多
票证

编辑票证的路径:
/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请求,渲染将不会。