MVC模型和方法

时间:2013-12-26 20:06:52

标签: ruby-on-rails ruby

我正试图围绕MVC模型,所以我想知道如何在其中实现一些东西。

我有一个具有不同属性的资源。我也有一个控制器,我从脚手架设置,如new,show等。

我理解它的方式是我应该在控制器中定义可供我的视图使用的内容。从那里开始,我想要做的是制作一个方法并在show视图中使用它。

我想创建一个.find方法来检查我资源的特定属性的所有值,例如我有一个名为users的资源,其属性为region。当我查看用户个人资料页面时,我想要一个区域列出与当前个人资料相同的区域中的所有用户。

我在哪里定义此方法?是在控制器或模型中,然后如何在视图中正确调用它?目前控制器中的show方法中已有代码,如果我是正确的,我理解代码的最后一行是执行的,或者在视图中打印出来,所以如何将其包含在它?它不会冲突吗?

我确定我不理解某些事情,但我只想提供一些指导。

3 个答案:

答案 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属于该区域的用户的关系都将是您在视图中使用的可用对象。