4

Rails プロジェクト:Project多くTicketの があります。

チケットの編集へのパス:/projects/12/tickets/11/edit

チケットを更新して検証が失敗した場合は、 を使用しますrender :action => "edit"

ただし、今回編集ビューがレンダリングされると、パスは次のように変更されます。/tickets/11/

つまり、いくつかのパラメーターが失われます。どうすれば元のパスを維持できますか?

ルート.rb:

  resources :projects do
    resources :tickets
  end
  resources :tickets

ticket_controller.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
4

2 に答える 2

1

リソースを2回呼び出しています。「いくつかのパラメータを失いたくない」場合は、2番目のパラメータを削除してください。

resources :projects do
  resources :tickets
end

ただし、resources :ticketsネストされていないものも必要な場合は、ネストしないように制限してshowindex作成および編集時に一部のパラメーターが失われないようにすることができます。

resources :projects do
  resources :tickets
end
resources :tickets, :only => [:index, :show]

編集-私は問題があなたの形にあると信じています。
両方のオブジェクトがあることを確認してください。

form_for([@project, @ticket]) do |f| 

projectまた、を作成または更新する前に、を見つける必要がありますticket。したがって、あなたneweditアクションは次のようなものでなければなりません:

@project = Project.find(params[:project_id])
@ticket = @project.ticket.build

createアクションについても同じです。

@project = Project.find(params[:project_id])
@ticket = @project.ticket.build(params[:ticket])

edit2-更新アクションは次のようになります。

@project = Project.find(params[:project_id])
@ticket = Ticket.find(params[:id])
if @ticket.update_attributes(params[:ticket])
...
于 2013-02-11T12:32:37.840 に答える
1

http://guides.rubyonrails.org/routing.html#nested-resourcesをご覧ください。などのネストされたルートヘルパーを使用して、コントローラーからネストされたリソースにリダイレクトできるはずですproject_ticket_path(@project, @ticket)

于 2013-02-11T12:35:52.953 に答える