我正试图围绕MVC模型,所以我想知道如何在其中实现一些东西。
我有一个具有不同属性的资源。我也有一个控制器,我从脚手架设置,如new,show等。
我理解它的方式是我应该在控制器中定义可供我的视图使用的内容。从那里开始,我想要做的是制作一个方法并在show视图中使用它。
我想创建一个.find
方法来检查我资源的特定属性的所有值,例如我有一个名为users
的资源,其属性为region。当我查看用户个人资料页面时,我想要一个区域列出与当前个人资料相同的区域中的所有用户。
我在哪里定义此方法?是在控制器或模型中,然后如何在视图中正确调用它?目前控制器中的show
方法中已有代码,如果我是正确的,我理解代码的最后一行是执行的,或者在视图中打印出来,所以如何将其包含在它?它不会冲突吗?
我确定我不理解某些事情,但我只想提供一些指导。
答案 0 :(得分:2)
正如Donovan在评论中提到的,您可能需要两个模型 - 用户和区域以及它们之间的关联来处理他们的查询,这是一个示例:
首先,您的users
表需要region_id
列来关联用户所属的区域。
分贝/迁移/ 20131227153435_create_users.rb
class CreateUsers < ActiveRecord::Migration
def change
create_table(:users) do |t|
t.belongs_to :region
# ...
end
end
end
在用户和区域模型中添加关联。
应用程序/模型/ user.rb
class User < ActiveRecord::Base
belongs_to :region
# ...
end
应用程序/模型/ region.rb
class Region < ActiveRecord::Base
has_many :users
# ...
end
然后你可以在控制器中得到你想要的东西。
user = User.find(1) # find the user with id = 1
user.region # to get the user's region
region = Region.find(1) # find the region with id = 1
region.users # to get all users who are in this region
请参阅Rails Guides Guidelines - Active Record Associations以获取更多详情。
答案 1 :(得分:0)
假设您有一个名为resourceone
的资源。
从数据库(通过模型)获取数据的逻辑将转到此文件:
app/controllers/resourceone_controller.rb
这看起来像这样
class ResourceoneController < ApplicationController
def index
@resourceones = Resourceone.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @resourceones }
end
end
end
现在您的视图将显示在此文件中:
app/views/resourceone/index.html.erb
这是您可以编写HTML并在erb标记中嵌入一些ruby代码的地方。
现在,在您的情况下,您需要在资源和用户之间建立关系。所以,一旦你这样做,在控制器中,你可以这样做:
@user = User.find(user_id)
@resourceones = Resourceone.where(user: @user)
视图中会自动提供@user
和@resourceones
等所有实例变量,因此您只需使用它们来呈现UI。
对于任何更具体的API,您可能需要访问http://guides.rubyonrails.org
答案 2 :(得分:0)
如果您正在使用关联,Sibevans的答案是处理此问题的最佳方法,但如果您正在使用现有的表并且区域恰好是您的用户模型的属性,我怀疑是这种情况,我会建议在用户模型中将查找方法构建为instance method
,最好使用描述性方法名称来解释它正在做什么。如果您愿意,可以稍后为instance method
创建别名:
class User < ActiveRecord::Base
def find_all_users_belonging_to_same_region
User.where(:region => self.region)
end
alias :find_region :find_all_users_belonging_to_same_region
end
注意这会返回一个ActiveRecord Relation而不是一个数组。如果你更喜欢一个数组,你可以像这样放一个.all
:
User.where(:region => self.region).all
相当于
User.find_all_by_region(self.region)
话虽如此,使用ActiveRecord Relation还是有好处的,以后您可以在该方法上链接其他数据库方法,例如
my_user.find_all_users_belonging_to_same_region.where("income > ?", 50000)
注意,由于find是ActiveRecord中的保留字,我建议不要将它用作方法的名称(如果要进入模型)。
然后在你的控制器中,你可以定义一个名为find的action
,它可以通过params在你拥有的用户的实例上运行。
获取用户/ 71 /查找
会将用户ID 71传递给控制器中的params散列,您可以按如下方式访问该对象上的方法:
def find
@user = User.find_by_id(params[:id])
@users_in_region = @user.find_all_users_belonging_to_same_region
end
您刚刚在控制器中创建的两个实例变量,一个是您当前的用户,第二个是您的数组或ActiveRecord属于该区域的用户的关系都将是您在视图中使用的可用对象。