项目有用户。 用户有费用。
我有一个当前登录用户的屏幕添加新费用,我的控制器基于current_user强制用户密钥。
现在我需要允许用户在特定项目中工作,并一次性输入该项目的费用,基本上“输入”项目费用屏幕,以限制该屏幕中显示的费用范围他们选择的项目。
(类似于basecamp让你选择一个你工作的项目的方式)
我确实希望将此视图用于其他内容,并希望尽可能将其视为DRY。
只是想知道,让用户选择项目的正确方法是什么,然后通过使用我现有的费用屏幕来坚持这个选择。
编辑 - 我希望能够选择一个项目,然后让费用页面上的所有功能都通过该项目传递给控制器方法。
所以我最终可以使用/ project / 45 /费用等等
谢谢!
class Project < ActiveRecord::Base
attr_accessible :name, :active
has_many :expenses, foreign_key: :project_id
end
class Expense < ActiveRecord::Base
attr_accessible :amount, :expense_date, :project_id, :expense_type_id, :user_id
belongs_to :project
belongs_to :user
belongs_to :expense_type
has_one :expense_approval
end
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
# Setup accessible (or protected) attributes for your model
attr_accessible :name, :email, :password, :password_confirmation, :remember_me
has_many :expenses, foreign_key: :user_id
end
答案 0 :(得分:1)
你有一套稍微复杂的关系。现在,您必须考虑应用程序中需要的查询语义。
记住你原来的帖子主题'嵌套......需要吗?'
这取决于您在应用中喜欢的各种查询语义。
最明显的'嵌套'关系是:
class Project < ActiveRecord::Base
attr_accessible :name, :active
has_many :expenses, foreign_key: :project_id
end
因此,如果在您的应用中,只查询属于项目的费用,您可以考虑创建嵌套路由,即:。
配置/ routes.rb中:
resources :project do
resources :expense
end
假设这是您应用中的唯一路线。引用任何费用的唯一方法是通过它所属的项目来完成。所以这个查询可用:
GET /project/101/expenses # index all expenses for project with id 101
但是,请查看使用routes.rb中的上述条目生成的NUMEROUS路由。要查看,使用'routes.rb'中包含的上述嵌套路由运行'rake routes',然后从'routes.rb'中删除上述条目并再次运行'rake routes'。
嵌套路线会添加很多路线。它可能会添加您不需要的许多路线。如果是这种情况,您可能想采取不同的方法。不要使用嵌套路线,而是使用HAND CRAFT只需要您真正需要的路线。