【问题标题】:Rails4: NoMethodError in UsersController#show, undefined methodRails4:UsersController#show中的NoMethodError,未定义的方法
【发布时间】:2016-03-12 22:30:00
【问题描述】:

我想开发一个计划应用程序。 每个用户创建自己的时间表。

我想将数据显示如下;

schedule title (user name)

  day1(mm/dd,yyyy)
    09:00 Math
    11:00 Science
    Room name A

  day2(mm/dd,yyyy)
    10:00 Physics 
    13:00 Music
    Room name B

如何在事件模型中显示课程信息?

例如标题(数学、科学)、时间(从、到)...

当我尝试显示页面时出现以下错误。

NoMethodError (undefined method `event' for #<Room:0x007fb2149a1ac8>
Did you mean?  events
           events=):
  app/views/schedules/_schedule.html.erb:6:in `block in _app_views_schedules__schedule_html_erb___2809280481749604534_70201410929300'
  app/views/schedules/_schedule.html.erb:4:in `_app_views_schedules__schedule_html_erb___2809280481749604534_70201410929300'
  app/views/users/show.html.erb:11:in `_app_views_users_show_html_erb__1629176981125983348_70201561746560'

如果您能给我任何建议,我们将不胜感激。

用户.rb

class User < ActiveRecord::Base
  has_many :schedlues
  has_many :rooms, through: :schedules
  ...

schedule.rb

class Schedule < ActiveRecord::Base
  belongs_to :user
  has_many :rooms
  ...

房间.rb

class Room < ActiveRecord::Base
  belongs_to :schedlue
  has_many :events

事件.rb

class Event < ActiveRecord::Base
  belongs_to :room

(虽然我认为'room has_many events'不合适,但我不知道。)

架构

create_table "users", force: :cascade do |t|
    t.string   "name"
    t.string   "email"
    ...
end

create_table "schedules", force: :cascade do |t|
    t.string   "title"
    t.integer  "user_id"
    ...
end

create_table "rooms", force: :cascade do |t|
    t.date     "date"
    t.string   "room_name"
    t.integer  "schedule_id"
    ...
end

create_table "events", force: :cascade do |t|
  t.time     "from"
  t.time     "to"
  t.string   "title"
    ...
end

users_controller.rb

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    @schedules = @user.schedules.paginate(page: params[:page])
  end
  ...

show.html.erb

    <% if @user.schedules.any? %>
      <ol class="schedules">
        <%= render @schedules %>
      </ol>
      <%= will_paginate @schedules %>
    <% end %>

_schedule.html.erb

<li>
  <p>
  <% schedule.room.each do |a| %>
    <p><b>Day <%= a.day %></b></p>
    <% a.event.each do |e| %>  #error occur
      <% if e.title.any? %>
        <%= e.title %>
      <% end %>
    <% end %>
    <p>room: <%= a.room_name %></p>
  <% end %>
  </p>
</li>

【问题讨论】:

  • 你的错误是undefined method 'event' for #&lt;Accomodation。这意味着您正在尝试在 Accomodation 实例上调用“事件”,并且该方法不存在。您没有粘贴您的 Accomodation 类,但如果您编写 event 实例方法,则会解决此特定错误。这并不能解决您的问题How can I display course information in the event model?,这对我来说有点过于宽泛,我不想回答。
  • 谢谢你的回答,@maxplener。我打错了,我用“房间”代替“住宿”。如果您能给我提示,将不胜感激。

标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-4.2


【解决方案1】:

如错误消息所述,Room 没有方法 event。原因是在你的模型中,你有has_many :events,它给你一个Association,而不是一个事件。所以试试:

room.events.first 

或类似的东西

room.events.each do |event|
  puts event
end

这应该可以解决您现在遇到的错误。

编辑我忘了看你的模板。以下行是错误的:

<% a.event.each do |e| %>

解决方法,如上所述:

<% a.events.each do |e| %>

有趣的是,您在schedule.room 上没有收到错误消息。那也错了,一定是schedule.rooms

【讨论】:

  • 感谢您的回答,@jdno。它在使用 ''。我还删除了 '' 因为错误。
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 2014-10-08
  • 2021-11-05
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
相关资源
最近更新 更多