Rails4: UsersController#show 中的 NoMethodError,未定义的方法
Rails4: NoMethodError in UsersController#show, undefined method
我想开发一个日程安排应用程序。
每个用户创建自己的时间表。
我想将数据显示如下;
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'
如果您能给我任何建议,我们将不胜感激。
user.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
...
room.rb
class Room < ActiveRecord::Base
belongs_to :schedlue
has_many :events
event.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>
如错误消息所述,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
.
我想开发一个日程安排应用程序。 每个用户创建自己的时间表。
我想将数据显示如下;
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'
如果您能给我任何建议,我们将不胜感激。
user.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
...
room.rb
class Room < ActiveRecord::Base
belongs_to :schedlue
has_many :events
event.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>
如错误消息所述,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
.