0

这应该是一个小问题。我的架构中有一个学生表和一个分类表。模型/表格关系以某种方式挂钩,当我这样做时

@student = Student.first.classifieds.all 

在 Rails 控制台中,我将获得该特定学生的所有分类广告

[#<Classified id: 3, ad_content: "在BC附近BU也可以、需要女生一起租房子、看了几处、俩人去租非常合算、限女生", ad_title: "BU和BC旁边的房子求室友一起租 ", student_id: 16, created_at: "2013-09-17 19:20:43", updated_at: "2013-09-17 19:49:31", location: "Allston">, #<Classified id: 1, ad_content: "Malden Towers 宽敞客厅出租,附带阳台,窗外是公寓的花园,客厅可用窗帘或木板隔开, 每月4...", ad_title: "Malden Towers 客厅出租 400/月", student_id: 16, created_at: nil, updated_at: "2013-09-17 19:47:55", location: "Malden">] 

我正在尝试过滤具有特定条件的记录,因此只有满足此特定条件的记录才能传递给视图,因此出现在该特定页面上。

我只想在位置等于malden时才显示记录。

在我的 students_controller.rb 我有这个

def malden_index
  @student = Student.first 
  for classified in @student.classifieds.all
    return classified if classified['location'] == 'Malden'
  end 

我认为这是

<%= classified.ad_content %>

我收到此错误

undefined local variable or method `classified'

我有三个问题

  1. 我可以在我的视图中添加条件吗?还是必须在我的控制器中?
  2. 我的记录是否以数组数据类型返回给我?
  3. 我的代码有什么问题?(我认为它很简单)(分类应该是每条记录,然后只有当位置键等于malden时才返回记录)
4

4 回答 4

1

首先:在视图中,您只能访问控制器中定义的实例变量。因此,for循环不会收集视图中可访问的任何内容。

所以你可以通过这样做来解决这个问题

def malden_index
  @student = Student.first
  @classifieds = @student.classifieds.where('location="Malden"')
end

在您看来,遍历所有@classifieds.

现在注意:这是完全硬编码的。我将按如下方式解决此问题:不使用单独的index方法,而是使用show(学生的)动作,检查是否给出了位置,如果是,则相应地过滤分类。

看起来像这样

def show
  @student = Student.find(params[:id])
  @classifieds = @student.classifieds
  if params[:location]
    @classifieds = @classifieds.where('location = ?', params[:location]
  end

结尾

然后您将按如下方式构建 url /students/1?location=malden

如果您随后将以下路线添加到config/routes.rb

get '/students/:id/:location', to: 'students#show' 

您可以将其改进为/students/1/malden.

于 2013-09-18T12:04:23.337 回答
1
  1. 您不应在视图中添加此条件过滤。在控制器中完成时要好得多。

  2. 过滤可以通过多种方式完成。让数据库完成工作通常是最好和最快的:

    @student.classifieds.where(:location => 'Malden').all
    
  3. 您可以通过将变量设为实例变量来转发变量,也可以@classifieds将其作为局部变量传递给您的视图render 'malden_index', :locals => {:classifieds => @student.classifieds.all}

通常,returnfor 循环中的方法不会产生您想要的过滤器。要么使用我在#2 中的建议,要么像这样构建你的数组

@classifieds = []
for classified in @student.classifieds.all
    @classifieds << classified if classified['location'] == 'Malden'
end

或更短且更“红宝石方式”:

@classifieds = @student.classifieds.keep_if{|cf| cf['location'] == 'Malden'}

然后,您可以访问视图中的 @classifieds 数组。尽管如此,我还是非常建议您尽可能使用数据库过滤器。

于 2013-09-18T12:12:45.167 回答
0
def malden_index
  @student = Student.first 
  @classified = @student.classifieds.find_by_location("Malden")

end 

鉴于:

<%= @classified.ad_content %>
于 2013-09-18T12:04:46.527 回答
0

尝试这个...

def malden_index
  @student = Student.first 
  @classified =  @student.classifieds.where(location: 'Malden').first
end

鉴于:

<%= @classified.ad_content %>  
于 2013-09-18T12:05:11.167 回答