0

在我的rails應用程序中,我希望用戶能夠以「新」形式選擇一個選項,但是如果該選項已經存在,我希望它更新當前選項。在redirect_to rails中轉發post參數

我有這個迄今爲止在我的創建方法:

def create 

    @cost = Cost.new(cost_params) 

    if Cost.exists?(:category => @cost.category, :option => @cost.option) 
    redirect_to action: 'update', id: Cost.where(:category => @cost.category, :option => @cost.option).first.id 
    else 
    respond_to do |format| 
     if @cost.save 
     format.html { redirect_to action: 'index', status: 303, notice: [true, 'Cost was successfully created.'] } 
     format.json { render json: @cost, status: :created, location: @cost } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @cost.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
end 

的問題是,它重定向我,例如cost/9 URL,這使得顯示頁面。我希望將id與cost_params直接發送到更新方法:

def update 
    @cost = Cost.find(params[:id]) 

    respond_to do |format| 
    if @cost.update_attributes(cost_params) 
     format.html { redirect_to action: 'index', status: 303, notice: [true, 'Cost was successfully updated.'] } 
     format.json { head :no_content } 
    else 
     format.html { render action: "edit" } 
     format.json { render json: @cost.errors, status: :unprocessable_entity } 
    end 
    end 
end 

應該重定向到索引頁面。

是否有任何有效的方法來做到這一點?

回答

0

而HTTP重定向總是會導致GET請求,而不是POST請求,所以重定向到update並沒有什麼意義。這不是Rails問題,這就是HTTP的工作原理。

如果要自動更新相關記錄,則必須從create操作中執行此操作。直接但懶惰的方法是從更新中複製代碼並將其粘貼到create內的if分支中。更正確的方法是對的update相關部分提取到一個單獨的,私有方法,並呼籲從兩個createupdate這個方法,是這樣的:

def create 
    @cost = Cost.new(cost_params) 

    if Cost.exists?(:category => @cost.category, :option => @cost.option) 
    @cost = Cost.where(:category => @cost.category, :option => @cost.option).first 
    really_update 
    else 
    respond_to do |format| 
     if @cost.save 
     format.html { redirect_to action: 'index', status: 303, notice: [true, 'Cost was successfully created.'] } 
     format.json { render json: @cost, status: :created, location: @cost } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @cost.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
end 

def update 
    @cost = Cost.find(params[:id]) 
    really_update 
end 

private def really_update 
    respond_to do |format| 
    if @cost.update_attributes(cost_params) 
     format.html { redirect_to action: 'index', status: 303, notice: [true, 'Cost was successfully updated.'] } 
     format.json { head :no_content } 
    else 
     format.html { render action: "edit" } 
     format.json { render json: @cost.errors, status: :unprocessable_entity } 
    end 
    end 
end