2015-10-06 75 views
0

我正在開發我的應用程序,其中用戶可以接受或拒絕來自其他用戶的提議,但出現問題,因爲當我創建例如5個工作提議,並嘗試拒絕或接受例如第三次提議,改變了第一次提議的狀態,我不知道發生了什麼事情?我遵循這個主題Product orders between 2 users,所以也許我理解錯了什麼?請幫我Rails方法工作出錯

我的模型:

#user 
has_many :jobs_given, class_name: 'Job' 
has_many :offers_recived, class_name: 'Offer', through: :jobs_given, source: :offers 

has_many :offers_made, class_name: 'Offer' 
has_many :jobs_take, class_name: 'Job', through: :offers_made, source: :job 

#job 
belongs_to :seller, class_name: 'User', foreign_key: :user_id 
has_many :offers 
has_many :buyers, class_name: 'User', through: :offers 

#offer 
belongs_to :job 
belongs_to :buyer, class_name: 'User', foreign_key: :user_id 
has_one :seller, class_name: 'User', through: :job 

def accept 
    self.status = true 
    save 
end 

def reject 
    self.status = false 
    save 
end 

我的控制器:

def create 
    @job = Job.find(params[:job_id]) 
    @offer = @job.offers.create(offer_params) 
    @offer.user_id = current_user.id 

    if @offer.save 
     redirect_to @job 
    else 
     redirect_to :back 
    end 
end 

def accept 
    offer = current_user.offers_recived.find(params[:id]) 
    offer.accept 
    flash[:success] = "Offer accepted!" 
    redirect_to :back 
end 

def reject 
    offer = current_user.offers_recived.find(params[:id]) 
    flash[:notice] = "Offer rejected!" 
    offer.reject 
    redirect_to :back 
end 

private 

def offer_params 
    params.require(:offer).permit(:pirce_offer, :status, :job_id, :user_id) 
end 
end 

我的觀點:

#offers/form 
= simple_form_for([@job, @job.offers.build]) do |f| 
= f.input :pirce_offer 
= f.button :submit 

#offers/offer 
%p= offer.pirce_offer 

= link_to "Accept this offer", accept_job_offer_path(offer, @job), method: :post 
= link_to "Reject this offer", reject_job_offer_path(offer, @job), method: :post 

#jobs/show 
= render @job.offers 

= render 'offers/form' 

@EDIT

Parameters: {"authenticity_token"=>"YB0i2/JmroyZBAOOyCom5NDwjxrPsGRFV6Uucnp1dNKmIGgED3H4cB7f2fnutRKCh2OjyQICQghM4Zoy13zZrw==", "job_id"=>"5", "id"=>"1"} 
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]] 
Offer Load (0.1ms) SELECT "offers".* FROM "offers" INNER JOIN "jobs" ON "offers"."job_id" = "jobs"."id" WHERE "jobs"."user_id" = ? AND "offers"."id" = ? LIMIT 1 [["user_id", 1], ["id", 1]] 
(0.1ms) begin transaction 
SQL (0.1ms) UPDATE "offers" SET "status" = ?, "updated_at" = ? WHERE "offers"."id" = ? [["status", "f"], ["updated_at", "2015-10-06 08:12:40.425741"], ["id", 1]] 
+0

嗯,看來你有一些調試的事情。什麼'params'到達你的'accept'方法?什麼生成它們?等等。 –

+0

我將它添加到我的問題 – exerq

回答

2

改變了第一次報價

永遠記住,在計算的狀態,這是你的故障如果事情不能正常工作。

系統是非常靈活和多變的程度,除非你有系統性的問題,沒有理由不起作用。


ID

的問題是幾乎可以肯定做的id你傳遞:

"job_id"=>"5", "id"=>"1" 

我不知道你的數據是什麼樣子,但是這是由此創建link_to

= link_to "Accept this offer", accept_job_offer_path(offer, @job), method: :post 

您的accept_job_offer_path會 - IMO - 分別具有[:job_id][:(offer)id]的參數。你以相反的方式發送它們。

試試這個:

= link_to "Accept this offer", accept_job_offer_path(@job, offer), method: :post 
= link_to "Reject this offer", reject_job_offer_path(@job, offer), method: :post 

這是假設你的數據結構是正確的。


數據

還有一些其他的問題,我可以看到:

current_user.offers_recived.find(params[:id]) 

你打電話current_user.offers_received不表明工作其收到的優惠。你當然希望在這個過程中包含這份工作?

此外,你可以幹起來你的行動頗有幾分:

#config/routes.rb 
resources :jobs do 
    match :offer, action: :update, via: [:post, :delete] #-> url.com/jobs/:job_id/offer 
end 

#app/controllers/jobs_controller.rb 
class JobsController < ApplicationController 
    def offer 
     @job = Job.find params[:job_id] 
     offer = current_user.offers_recived.find(params[:id]) 
offer.accept 
     if request.post? 
     offer.accept 
     elseif request.delete? 
     offer.reject 
     end 
    end 
end 
2

假設你已嵌套:offers嵌套在:jobs嵌套資源您的路徑在您的"Accept this offer""Reject this offer"鏈接錯誤的方式。

這意味着你發送報價的id作爲params[:job_id](除非它不會有一個id但因爲你纔剛剛建立了它),然後params[:id]@job的ID。這就是爲什麼它更新了錯誤的報價 - 這是因爲它正在更新與ID匹配的報價@job

當你剛剛在表單中建立它時,你如何通過id找到要約可能是沿着這條路的下一步。