首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails:在不同控制器中调用模型中的方法

Rails:在不同控制器中调用模型中的方法
EN

Stack Overflow用户
提问于 2019-06-17 14:32:09
回答 2查看 456关注 0票数 0

拜托,我真的不知道如何按照最佳的rails实践最好地实现这段代码的重构。我正在尝试调用rails应用程序中在不同控制器中的模型中定义的一些方法。

我有一个捐赠模型和一个仪表板控制器,我想在仪表板上显示一些捐赠数据。我希望通过在捐赠模型中的某些方法和作用域中定义所需的数据来实现这一点,然后在仪表板控制器中调用这些数据,然后在*仪表板视图**中提供这些数据。

但是我意识到在仪表板上没有显示捐赠数据,这可能是因为捐赠模型中的方法在被调用时不会被公开或不能被仪表板控制器使用,因为它们是不同的模型和不同的控制器。

这是我的密码

捐赠模型

代码语言:javascript
复制
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

仪表板控制器

代码语言:javascript
复制
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

仪表板索引

代码语言:javascript
复制
<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>

请允许我对如何重构这段代码以及如何将捐赠模型方法公开给仪表板控制器提供一些帮助。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-19 10:39:33

终于,我开始工作了。

我需要使用普通的旧Ruby对象来实现服务对象,对于每个操作,我将它们放置在一个单独的服务中,然后在控制器中调用它们。

步骤如下

  1. 在应用程序的app目录下创建一个名为services的文件夹。
  2. 为每个控制器操作创建单独的服务。
  3. 调用控制器上所需的每个服务。

就这样。

票数 0
EN

Stack Overflow用户

发布于 2019-07-16 16:28:33

你也可以试试这个。

控制器和模型有一个名为concerns的文件夹,您可以在其中保存希望由不同控制器和/或模型共享的代码。

只需将要共享的代码移动到关注点文件夹,然后在每个模型上调用它们。

您可以使用模块在关注点文件夹中定义代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56633468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档