如何使用 rails 继续接受和拒绝功能
How to proceed accept and reject feature with rails
我正在尝试一项功能,用户可以在其中请求报价并且可以接受或拒绝,我是 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 %>
有什么好的方法吗?当我接受这个时,我怎样才能让它消失。
抱歉,那还差得远。当您应该做的是更新现有记录时,您只是在表格中创建新的报价记录 - 虽然您可能通过 PATCH /offers/:id
执行此操作,但它在意图方面会非常模糊。
我认为处理此问题的最简单方法是简单地添加两个 additional RESTful routes 来更新报价。
首先添加路线:
resources :offers, only: [] do
patch :accept
patch :decline
end
以及模型的枚举属性:
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
这是一个比添加布尔值更好的主意,因为您的布尔值要么需要是 tri-state 布尔值(可空),这被认为是非常糟糕的做法,要么默认为 false,在这种情况下您可以' t 区分用户已回复或未回复的报价。
然后为您的新端点添加控制器方法:
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
然后您可以简单地添加 buttons/links 发送更新报价的请求:
<%= button_to "Accept", accept_offer_path(offer), method: :patch %>
<%= button_to "Reject", reject_offer_path(offer), method: :patch %>
这不是解决问题的唯一方法。例如,如果你想记录一条消息,用户可以在其中说出他们拒绝报价的原因,我会将对报价的回复建模为完全独立的资源。
我正在尝试一项功能,用户可以在其中请求报价并且可以接受或拒绝,我是 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 %>
有什么好的方法吗?当我接受这个时,我怎样才能让它消失。
抱歉,那还差得远。当您应该做的是更新现有记录时,您只是在表格中创建新的报价记录 - 虽然您可能通过 PATCH /offers/:id
执行此操作,但它在意图方面会非常模糊。
我认为处理此问题的最简单方法是简单地添加两个 additional RESTful routes 来更新报价。
首先添加路线:
resources :offers, only: [] do
patch :accept
patch :decline
end
以及模型的枚举属性:
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
这是一个比添加布尔值更好的主意,因为您的布尔值要么需要是 tri-state 布尔值(可空),这被认为是非常糟糕的做法,要么默认为 false,在这种情况下您可以' t 区分用户已回复或未回复的报价。
然后为您的新端点添加控制器方法:
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
然后您可以简单地添加 buttons/links 发送更新报价的请求:
<%= button_to "Accept", accept_offer_path(offer), method: :patch %>
<%= button_to "Reject", reject_offer_path(offer), method: :patch %>
这不是解决问题的唯一方法。例如,如果你想记录一条消息,用户可以在其中说出他们拒绝报价的原因,我会将对报价的回复建模为完全独立的资源。