我希望用户可以接受来自其他用户的优惠,我正在关注来自Product orders between 2 users的@Andy H答案,但我有这个错误,其中包含接受方法的链接:
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'
答案 0 :(得分:2)
没有路线匹配{:action =>“accept”,:controller =>“offers”,:id => nil, :job_id => nil}缺少必需的键:[: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