Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails方法工作错误_Ruby On Rails - Fatal编程技术网

Ruby on rails Rails方法工作错误

Ruby on rails Rails方法工作错误,ruby-on-rails,Ruby On Rails,我正在开发我的应用程序,用户可以接受或拒绝其他用户提供的服务,但出现了一些问题,因为当我创建了5份工作邀请,并尝试拒绝或接受第三份工作邀请时,第一份工作邀请的状态发生了变化,我不知道发生了什么?我关注这个话题,所以也许我理解错了什么?请帮帮我 我的模型: #user has_many :jobs_given, class_name: 'Job' has_many :offers_recived, class_name: 'Offer', through: :jobs_given, source:

我正在开发我的应用程序,用户可以接受或拒绝其他用户提供的服务,但出现了一些问题,因为当我创建了5份工作邀请,并尝试拒绝或接受第三份工作邀请时,第一份工作邀请的状态发生了变化,我不知道发生了什么?我关注这个话题,所以也许我理解错了什么?请帮帮我

我的模型:

#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'
@编辑


假设您已将资源嵌套在
:offer
下,嵌套在
:jobs
下,则在
的“接受此offer”
的“拒绝此offer”
链接中,路径错误

这意味着您正在以
params[:job\u id]
的形式发送报价的id(除非它还没有id,因为您刚刚构建了它),然后
params[:id]
@job
的id。这就是为什么它更新了错误的报价-这是因为它正在使用与
@job
匹配的id更新报价


如果你只是在表单中创建了一个offer,那么如何通过id找到它可能是下一步工作。

假设你将资源嵌套在
:jobs
下:offers嵌套在
:jobs
下,你的
“接受此offer”
“拒绝此offer”中的路径是错误的
链接

这意味着您正在以
params[:job\u id]
的形式发送报价的id(除非它还没有id,因为您刚刚构建了它),然后
params[:id]
@job
的id。这就是为什么它更新了错误的报价-这是因为它正在使用与
@job
匹配的id更新报价

如果你只是在表单中创建了一个id,那么你将如何找到它,这可能是下一步

更改第一个报价的状态

永远记住,在计算中,如果某些东西不能正常工作,那是你的错

系统是非常通用和灵活的,除非你有系统性的问题,否则没有理由不工作


ID

问题几乎肯定与您要传递的
id
有关:

"job_id"=>"5", "id"=>"1"
我不知道您的数据是什么样子的,但这是通过链接到创建的:

= link_to "Accept this offer", accept_job_offer_path(offer, @job), method: :post
您的
accept\u job\u offer\u path
将-IMO-分别将参数设置为
[:job\u 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])
您正在呼叫
当前用户。收到的工作机会
,但未指明收到工作机会的工作。你肯定想把这份工作也包括进来

此外,您还可以让自己的行为干涸一点:

#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
#config/routes.rb
资源:工作做什么
匹配:offer,action::update,via:[:post,:delete]#->url.com/jobs/:job\u id/offer
结束
#app/controllers/jobs\u controller.rb
类JobsController
更改第一个报价的状态

永远记住,在计算中,如果某些东西不能正常工作,那是你的错

系统是非常通用和灵活的,除非你有系统性的问题,否则没有理由不工作


ID

问题几乎肯定与您要传递的
id
有关:

"job_id"=>"5", "id"=>"1"
我不知道您的数据是什么样子的,但这是通过链接到
创建的:

= link_to "Accept this offer", accept_job_offer_path(offer, @job), method: :post
您的
accept\u job\u offer\u path
将-IMO-分别将参数设置为
[:job\u 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])
您正在呼叫
当前用户。收到的工作机会
,但未指明收到工作机会的工作。你肯定想把这份工作也包括进来

此外,您还可以让自己的行为干涸一点:

#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
#config/routes.rb
资源:工作做什么
匹配:offer,action::update,via:[:post,:delete]#->url.com/jobs/:job\u id/offer
结束
#app/controllers/jobs\u controller.rb
类JobsController
看来您还有一些调试要做。什么
params
到达您的
accept
方法?是什么产生了它们?等等。我把它添加到我的问题中。好吧,看来你要做一些调试。什么
params
到达您的
accept
方法?是什么产生了它们?等等。我把它添加到我的问题中