首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个有多种型号的控制器?我做得对吗?

一个有多种型号的控制器?我做得对吗?
EN

Stack Overflow用户
提问于 2010-06-12 13:52:06
回答 3查看 7.9K关注 0票数 5

到目前为止,我的网络应用程序一直相当直截了当。我有用户,联系人,约会和其他一些事情要管理。所有这些都很简单--每个部分只是一个模型,所以我只是为每个部分做了一个脚手架,然后修改了脚手架代码以满足我的需要。很容易..。

不幸的是,我在下一节有一个问题,因为我希望我的应用程序的'Financials‘部分比其他部分更深入,我只是搭建了脚手架。例如,当用户单击导航栏上的“联系人”链接时,它只显示一个联系人列表,非常直接,并且与脚手架一致。但是,当用户单击导航栏上的“Financials”链接时,我希望在页面左侧显示银行帐户,在右边显示一些交易。

因此,financials选项卡基本上可以处理来自两个模型的数据:事务处理和bank_accounts。我认为我应该建立模型(transactions & bank_accounts),然后制作一个名为Financials的控制器,然后我可以从Financials控制器中查询模型,并在app/view/financials/中显示页面。

这个应用程序布局正确吗?我从来没有比脚手架的基础更多的工作,所以我想确保我得到正确的!

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-12 14:26:58

如果您对脚手架感到舒服,那么我建议您为两者生成一个脚手架。

交易:script/generate scaffold transaction financial_id:integer ...

bank_accounts:script/generate scaffold bank_account financial_id:integer ...

和金融公司script/generate scaffold financials ...

在您的事务模型中,添加以下内容:

代码语言:javascript
复制
class Transaction < ActiveRecord::Base
  belongs_to :financial
end

在您的bank_account模型中,添加以下内容:

代码语言:javascript
复制
class Bank_account < ActiveRecord::Base
  belongs_to :financial
end

在您的财务模型中,添加以下内容:

代码语言:javascript
复制
class Financial < ActiveRecord::Base
  has_many :transactions
  has_many :bank_accounts
end

现在,从您的财务控制器,您可以使用这样的东西:

代码语言:javascript
复制
def index
  @financial = Financial.find(params[:id])

  #This fetches all bank_accounts related to financial
  @bank_accounts = @financial.bank_accounts

  #This fetches all transactions related to financial
  @transactions = @financial.transactions
end

在您的视图中,只需这样做,就可以查看属于某一特定金融机构的所有银行帐户:

代码语言:javascript
复制
<% @bank_accounts.each do |bank_account| -%>
   <%=h bank_account.something_here %> <!-- something_here is the column name corresponding to your bank_account table.  -->
   <%=h bank_account.something_here %> <!-- something_here is the column name corresponding to your bank_account table.  -->
   <%=h bank_account.something_here %> <!-- something_here is the column name corresponding to your bank_account table.  -->
   .
   .
   .
<% end -%>

在您的视图中,您可以通过添加类似的内容来查看属于特定金融的所有事务:

代码语言:javascript
复制
<% @transactions.each do |transaction| -%>
   <%=h transaction.something_here %> <!-- something_here is the column name corresponding to your bank_account table.  -->
   <%=h transaction.something_here %> <!-- something_here is the column name corresponding to your bank_account table.  -->
   <%=h transaction.something_here %> <!-- something_here is the column name corresponding to your bank_account table.  -->
   .
   .
   .
<% end -%>

请记住,在创建新的事务/银行帐户时,使用属于特定金融机构的id。希望这能有所帮助。干杯!:)

票数 4
EN

Stack Overflow用户

发布于 2010-06-12 15:43:46

在我看来,你好像想要两种观点:

但是,当用户单击导航栏上的“Financials”链接时,我希望在页面左侧显示银行帐户,在右边显示right.the事务中的一些事务。

记住,在MVC中,一个屏幕并不总是意味着一个视图。从概念上讲,视图只是呈现模型数据,这样用户就可以通过控制器操作来做一些有意义的事情。Rails让您在视图/目录中为每个屏幕创建一个文件,从而使这一点变得有些混乱,因此很容易认为一个屏幕意味着一个视图。但是,您也可以在Rails中的视图中调用布局,这些布局本身就是视图。

将事务和帐户放在单独的视图中意味着每个视图都有一个控制器来处理用户与每个数据段的交互。例如,帐户控制器将处理用户选择帐户以查看有关帐户的其他信息的事件。这将导致获取事务以显示用户。然后,用户可以与事务进行交互,以尝试协调、无效或竞争事务。这将调用事务控制器中的逻辑。

虽然这样做可以很好地消除控制器中的耦合,但这看起来像是耦合了两个视图。但是,耦合是单向的:帐户列表包含特定于事务视图的逻辑(即在选择帐户时对其进行更新)。事务视图在应用程序的其他领域仍然可重用。在大多数情况下,帐户列表仍然是可重用的,特别是当您将其隔离到单独的布局中时。对于这个特定的屏幕,您需要的唯一不同是用户单击帐户时的处理。

如果将所有内容合并到一个金融类视图中,仍然有可能保持松散耦合,但这样做会变得更加困难。额外的层需要额外的努力,并可能下意识地指导您将所有东西合并在一起。

当然,这两种方法都是可行的,而且您可以很容易地认为,最终的设计是一个最好留给开发人员的练习。我只是简单地解释了如何最准确地坚持Rails试图引导开发人员使用的模式。

票数 1
EN

Stack Overflow用户

发布于 2010-06-12 14:01:40

我对Rails或MVC工作没有太多的经验,但我认为您这样做是正确的。您通常希望为面向数据的资源建立模型对象(扩展为数据库表).也就是说,你的模型应该与你的“名词”相对应。你的控制器的行为是你的“动词”,对我来说,把它们按你喜欢的分类是非常有意义的。

在这种情况下,我要说的是,在financials下放置一组“谓词”(它们根据需要与两种模型对象类型交互)是有意义的,前提是对您来说这样组织它是有意义的。(请记住,您也可以评估相应的URL对您有多好的组织和直觉,尽管我相信大多数MVC纯粹主义者都会补充说,您不应该仅仅依赖于检查URL!)

总之,我认为只要这对你有意义,你就会在这里做任何事情。是的,您必须自己编写视图和控制器操作,尽管您可以开始使用ruby script/generate controller financials action1 action2 [...];这至少会给您提供视图文件和空控制器操作的框架。

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

https://stackoverflow.com/questions/3028892

复制
相关文章

相似问题

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