Rails 接受方法

Rails accept method

我希望用户可以接受来自其他用户的报价,我正在关注来自 Product orders between 2 users 的@Andy H 回答,但我在 link 接受方法时遇到此错误:

No route matches {:action=>"accept", :controller=>"offers", :id=>nil, :job_id=>nil} missing required keys: [:id, :job_id]
#my link to accept method
=link_to "Accept this offer", accept_job_offer_path(@offer), method: :post 

这是我的报价控制器: class OffersController < ApplicationController

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
end

def reject
    offer = current_user.offers_recived.find(params[:id])
    offer.reject
end

private

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

和我的联想:

#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

我的路线:

  resources :jobs do
   resources :offers do
     member do
       post :accept
       post :reject
     end
   end
end

我做错了什么?感谢帮助!

@edit

我的观点:

  #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), method: :post 

 #jobs/show
 = render @job.offers

 = render 'offers/form'

No route matches {:action=>"accept", :controller=>"offers", :id=>nil, :job_id=>nil} missing required keys: [:id, :job_id]

如错误所述,route 缺少必需的键 :id:job_id.您没有传递 :job_id 的值,而是传递 @offer:id,应该是 offer.

以下应该有效

=link_to "Accept this offer", accept_job_offer_path(offer, offer.job_id), method: :post

=link_to "Accept this offer", accept_job_offer_path(offer, @job), method: :post #if you defined @job in the controller