在 Ruby on Rails 项目中实现从 API 提取数据并在控制器中保存出价,然后显示在用户页面上,涉及以下核心概念:
首先需要创建 Bid 模型:
rails generate model Bid amount:decimal user_id:integer item_id:integer
rails db:migrate
在 app/models/bid.rb
:
class Bid < ApplicationRecord
belongs_to :user
belongs_to :item
validates :amount, presence: true, numericality: { greater_than: 0 }
end
在 app/models/user.rb
和 app/models/item.rb
中添加反向关联:
# 在 User 模型中
has_many :bids
# 在 Item 模型中
has_many :bids
生成 bids 控制器:
rails generate controller Bids
在 app/controllers/bids_controller.rb
中:
class BidsController < ApplicationController
before_action :authenticate_user!
def create
@bid = current_user.bids.new(bid_params)
if @bid.save
render json: @bid, status: :created
else
render json: @bid.errors, status: :unprocessable_entity
end
end
def index
@bids = Bid.where(item_id: params[:item_id]).order(created_at: :desc)
render json: @bids
end
private
def bid_params
params.require(:bid).permit(:amount, :item_id)
end
end
在 config/routes.rb
中添加:
resources :bids, only: [:create, :index]
假设使用 ERB 模板,在视图文件中显示出价:
<!-- app/views/items/show.html.erb -->
<h2>当前出价</h2>
<div id="bids-list">
<% @bids.each do |bid| %>
<div class="bid">
<p>用户: <%= bid.user.email %></p>
<p>金额: <%= number_to_currency(bid.amount) %></p>
<p>时间: <%= bid.created_at %></p>
</div>
<% end %>
</div>
<%= form_with(model: [@item, @item.bids.new], url: bids_path, remote: true) do |f| %>
<%= f.hidden_field :item_id, value: @item.id %>
<%= f.number_field :amount, step: 0.01 %>
<%= f.submit "提交出价" %>
<% end %>
在 app/javascript/packs/application.js
或单独的文件中:
document.addEventListener('turbolinks:load', function() {
const bidForm = document.querySelector('#new_bid');
if (bidForm) {
bidForm.addEventListener('ajax:success', function(event) {
const [data, status, xhr] = event.detail;
// 更新页面上的出价列表
const bidsList = document.getElementById('bids-list');
const newBid = document.createElement('div');
newBid.className = 'bid';
newBid.innerHTML = `
<p>用户: ${data.user.email}</p>
<p>金额: $${data.amount}</p>
<p>时间: ${new Date(data.created_at).toLocaleString()}</p>
`;
bidsList.prepend(newBid);
// 清空表单
bidForm.querySelector('input[type="number"]').value = '';
});
bidForm.addEventListener('ajax:error', function(event) {
const [data, status, xhr] = event.detail;
alert('出价失败: ' + data.errors.join(', '));
});
}
});
可能原因:
解决方案:
可能原因:
解决方案:
turbolinks:load
事件可能原因:
解决方案:
# 在控制器中使用 includes 避免 N+1 查询
@bids = Bid.where(item_id: params[:item_id]).includes(:user).order(created_at: :desc)
# 在 Item 模型中添加方法
def highest_bid
bids.maximum(:amount)
end
通过以上实现,您可以创建一个完整的出价系统,从 API 接收出价数据,保存到数据库,并在用户界面上实时显示。
没有搜到相关的文章