Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:在不同控制器的模型中调用方法_Ruby On Rails - Fatal编程技术网

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

Ruby on rails Rails:在不同控制器的模型中调用方法,ruby-on-rails,Ruby On Rails,拜托,我真的不知道如何按照rails的最佳实践来重构代码。我试图在不同的控制器中调用rails应用程序模型中定义的一些方法 我有一个捐赠模型和一个仪表板控制器,我想在仪表板上显示一些关于捐赠的数据。我希望通过在模型的某些方法和作用域中定义所需的数据,然后在仪表板控制器中调用这些数据,然后在*仪表板视图**中使其可用来实现这一点 但我意识到,仪表板上没有显示任何关于捐赠的数据,这可能是因为捐赠模型中的方法在调用时没有公开或仪表板控制器无法使用,因为它们是不同的模型和不同的控制器 这是我的密码 捐赠

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

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


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

这是我的密码

捐赠模式

仪表板控制器

仪表板索引


请告诉我,我非常感谢您对如何重构此代码以及如何将模型方法公开给Dashboard控制器提供帮助。谢谢。

最后,我让它开始工作了

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

步骤是

在名为的应用程序的应用程序目录下创建文件夹 服务。 为每个控制器操作创建单独的服务。 在控制器上调用所需的每个服务。
就这些。

你也可以试试这个

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

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


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

由于捐赠模型中的方法未公开或仪表板控制器无法使用,这是无意义的。模型只在其控制器中可用。可能很简单,因为您没有在视图中使用这些实例变量。哦,我很抱歉这句话。那么我该如何解决这个问题呢,我还不是RubyonRails方面的专家。使用视图中的变量我已经在调用实例变量了——我不这么认为。否则你就会看到数据。显示视图。如果它很大,那么只有你声称使用变量的相关部分看起来像是变量。在这种情况下,路由是可疑的。您确定正确调用了仪表板索引页吗?让我们看看请求日志。但实际的问题是什么?如果确实直接请求dashboardindex操作并呈现其视图,则不需要这样做。这真的是一个路由问题吗,也就是说,你撞到了另一个控制器?
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>