我正在嘗試一個用戶可以請求報價并且可以接受或拒絕的功能,我是 Rails 新手。我無法弄清楚進行此操作的好方法是什么。報價創建方法
def create
@offer = Offer.new(offer_params)
pp offer_params
@barter = Barter.find(params[:barter_id])
@offer = Offer.new(offer_params)
@offer.barter = @barter
@offer.user = current_user
respond_to do |format|
if @offer.save
format.js do
@barter = Barter.find(params[:barter_id])
end
else
format.html { render :new, status: :unprocessable_entity }
format.json { render json: @review.errors, status: :unprocessable_entity }
end
end
結尾
報價提交
<%= form_for([ @barter, @barter.offers.new] ) do |form| %>
<%= form.text_area :message %><br>
<%= form.submit "leave" %>
<% end %>
在這里我想讓它被接受或拒絕,我給出了一個布林值,并在被拒絕時簡單地使其為假
<%= form_tag([ @barter, @barter.offers.new] ) do %>
<%= hidden_field_tag :reject, :value => true %><br>
<%= submit_tag "reject" %>
<% end %>
有什么好的方法嗎?當我接受這一點時,我怎樣才能讓它消失。
uj5u.com熱心網友回復:
對不起,但那甚至不接近。當您應該做的是更新現有記錄時,您只是在表單中創建一個新的報價記錄 - 雖然您可能會通過PATCH /offers/:id它在意圖方面非常模棱兩可來做到這一點。
我認為處理此問題的最簡單方法是簡單地添加兩個額外的 RESTful 路由來更新優惠。
首先添加路線:
resources :offers, only: [] do
patch :accept
patch :decline
end
并將 enum 屬性賦予模型:
class AddStatusToOffers < ActiveRecord::Migration[7.0]
def change
add_column :offers, :status, :integer, default: 0, index: true
end
end
class Offer < ApplicationRecord
# ...
enum status: {
pending: 0,
accepted: 1,
rejected: 2
}
end
這是一個比添加布林值更好的主意,因為您的布林值要么需要是三態布林值(可為空),這被認為是一種非常糟糕的做法,要么默認為 false,在這種情況下,您無法區分用戶的報價有沒有回復。
然后為您的新端點添加控制器方法:
class OffersController
before_action :set_coffer, only: %i{ show edit update destroy accept decline }
# ...
# PATCH /offers/:id/accept
# @TODO authorize that the user should actually be allowed the offer
def accept
if @offer.accepted!
redirect_to @offer, notice: 'Offer accepted'
else
redirect_to @offer, notice: 'Offer could not be accepted - please try again'
end
end
# PATCH /offers/:id/reject
# @TODO authorize that the user should actually be reject the offer
def reject
if @offer.rejected!
redirect_to @offer, notice: 'Offer rejected'
else
redirect_to @offer, notice: 'Offer could not be rejected - please try again'
end
end
private
def set_offer
@offer = Offer.find(params[:id])
end
end
然后,您可以簡單地添加發送請求以更新報價的按鈕/鏈接:
<%= button_to "Accept", accept_offer_path(offer), method: :patch %>
<%= button_to "Reject", reject_offer_path(offer), method: :patch %>
這不是解決問題的唯一方法。例如,如果您想記錄一條訊息,用戶可以在其中說明他們拒絕報價的原因,我會將對報價的回復建模為完全獨立的資源。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/464555.html
