찾다

 >  Q&A  >  본문

ruby - 为什么ActiveRecord_Relation不能调用实例方法?该怎么实现?

数据设计大概是这样的:

section belongs_to :page
page has_many :sections

想实现的功能是:

利用public#show来显示相应permalink的Page所包含的所有sections.
get 'show/:permalink', :to => 'public#show'

controller 代码

class PublicController < ApplicationController

  layout 'public'

  def index
    # intro text
    
  end

  def show
    @page = Page.where(:permalink => params[:permalink], :visible => true)
    puts "get permalink:", params[:permalink]
    puts "permalink",@page
    if @page.nil?
      redirect_to(action: 'index')
    else
      #display the page content using show .html.erb
      
    end
  end
end

p4是通过where条件查出来的

`irb(main):048:0> p4 = Page.where(permalink:"page4")
Page Load (0.4ms) SELECT pages.* FROM pages WHERE pages.permalink = 'page4'
=> #<ActiveRecord::Relation [#<Page id: 43, subject_id: 28, name: "page4", permalink: "page4", position: 1, visible: true, created_at: "2016-05-27 06:43:27", updated_at: "2016-05-27 06:43:54">]>`

p5是直接找到了那条数据,我认为p4和p5是一样的,都可以调用Page的实例方法

`irb(main):057:0> p5 = Page.last
Page Load (0.4ms) SELECT pages.* FROM pages ORDER BY pages.id DESC LIMIT 1
=> #<Page id: 43, subject_id: 28, name: "page4", permalink: "page4", position: 1, visible: true, created_at: "2016-05-27 06:43:27", updated_at: "2016-05-27 06:43:54">`

可结果确不行:

`irb(main):065:0* p4.class
=> Page::ActiveRecord_Relation
irb(main):066:0> p5.class
=> Page(id: integer, subject_id: integer, name: string, permalink: string, position: integer, visible: boolean, created_at: datetime, updated_at: datetime)`

报错如下

`
undefined method `sections' for #<Page::ActiveRecord_Relation:0x007facb084bc50>
Extracted source (around line #5):

<h2><%= @page.name %></h2>

<% @page.sections.visible.sorted.each do |section| %>
<p class="section">

<% case section.content_type %>
<% when 'HTML' %>

`

淡淡烟草味淡淡烟草味2775일 전873

모든 응답(2)나는 대답할 것이다

  • 世界只因有你

    世界只因有你2017-04-24 16:02:44

    이 문제는 해결되었습니다. 모두 감사합니다!

    .first를 추가하세요
    으아아아

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-24 16:02:44

    마이그레이션 코드를 볼 수 있나요?

    회신하다
    0
  • 취소회신하다