拜托,我真的不知道如何按照最佳的rails实践最好地实现这段代码的重构。我正在尝试调用rails应用程序中在不同控制器中的模型中定义的一些方法。
我有一个捐赠模型和一个仪表板控制器,我想在仪表板上显示一些捐赠数据。我希望通过在捐赠模型中的某些方法和作用域中定义所需的数据来实现这一点,然后在仪表板控制器中调用这些数据,然后在*仪表板视图**中提供这些数据。
但是我意识到在仪表板上没有显示捐赠数据,这可能是因为捐赠模型中的方法在被调用时不会被公开或不能被仪表板控制器使用,因为它们是不同的模型和不同的控制器。
这是我的密码
捐赠模型
class Donation < ApplicationRecord
belongs_to :program
scope :paid_count, -> { where(payment: true).count }
scope :unpaid_count, -> { where(payment: false).count }
scope :paid_sum, -> { where(payment: true).sum(:amount) }
scope :deployed_sum, -> { where(deployment: true).sum(:amount) }
scope :not_deployed_sum, -> { where(deployment: false, payment: true).sum(:amount) }
def self.deployed_donations_percent
(deployed_sum.to_f / paid_sum.to_f) * 100
end
def self.not_deployed_donations_percent
(not_deployed_sum.to_f / paid_sum.to_f) * 100
end
end仪表板控制器
class DashboardController < ApplicationController
def index
# Paid Donations in Chart
@paid_donations = Donation.paid_count
# Unpaid Donations in Chart
@unpaid_donations = Donation.unpaid_count
# Total Donations Sum
@total_donations_sum = Donation.paid_sum
# Deployed Donations
@deployed_donations = Donation.deployed_sum
# Not Deployed Donations
@not_deployed_donations = Donation.not_deployed_sum
# Deployed Donations Percentage
@deployed_donations_percent = Donation.deployed_donations_percent
# Not Deployed Donations Percentage
@not_deployed_donations_percent = Donation.not_deployed_donations_percent
@total_donations = Donation.count
# Paid Donations
@paid_donations = Donation.paid_count
# Unpaid Donations
@unpaid_donations = Donation.unpaid_count
# All Programs
@programs = Program.all
end
end仪表板索引
<h2>
DASHBOARD
</h2>
<h4>Overall Donations</h4>
<%#= area_chart @donations.map { |pay|{name: pay.payment, data: @donations.where(payment: pay).group_by_day(:created_at).count}}, discrete: true %>
<%= line_chart Donation.group(:payment).group_by_day(:created_at).count
<h4>Total Donations</h4>
<%= number_with_delimiter(@total_donations_sum, :delimiter => ',') %>
<h4>Deployed</h4>
<%= number_with_delimiter(@deployed_donations, :delimiter => ',') %>
<div>
<%= @deployed_donations_percent.round %>>
</div>
<h4>Undeployed</h4>
<%= number_with_delimiter(@not_deployed_donations, :delimiter => ',') %>
<div>
<%= @not_deployed_donations_percent.round %>
</div>
<h4>Total Donations</h4>
<header>
<%= @total_donations %>
</header>
<h4>Paid Donations</h4>
<header>
<%= @paid_donations %>
</header>
<h4>Unpaid Donations</h4>
<header>
<%= @unpaid_donations %>
</header>
PROGRAMS
<td>Program Name</td>
<td>Sponsored</td>
</tr>
<% @programs.each do |program| %>
<tr>
<td><%= program.name %></td>
<td><%= program.donations.count %></td>请允许我对如何重构这段代码以及如何将捐赠模型方法公开给仪表板控制器提供一些帮助。谢谢。
发布于 2019-06-19 10:39:33
终于,我开始工作了。
我需要使用普通的旧Ruby对象来实现服务对象,对于每个操作,我将它们放置在一个单独的服务中,然后在控制器中调用它们。
步骤如下
就这样。
发布于 2019-07-16 16:28:33
你也可以试试这个。
控制器和模型有一个名为concerns的文件夹,您可以在其中保存希望由不同控制器和/或模型共享的代码。
只需将要共享的代码移动到关注点文件夹,然后在每个模型上调用它们。
您可以使用模块在关注点文件夹中定义代码。
https://stackoverflow.com/questions/56633468
复制相似问题