【发布时间】:2015-09-10 19:39:40
【问题描述】:
我有两个相互关联的表,称为 event_groups 和 events。
型号如下:
class EventGroup < ActiveRecord::Base
validates :event_group_name, presence: true, uniqueness: true has_many :events
accepts_nested_attributes_for :events, allow_destroy: true
end
class Event < ActiveRecord::Base
belongs_to :event_group
validates :event_group_id, presence: true
validates :event_description, presence: true, uniqueness: true
end
我使用 rails generate scaffold 生成了 CRUD 实用程序... 并且目前正在尝试编辑事件控制器和视图以显示连接表中的数据。
我已经能够使用以下方法成功加入表并显示 event_groups 和 events 中的事件 index.html.erb 视图的数据:
def index
@events = Event.select ("events.id, event_groups.event_group_name, events.event_description, events.event_location, events.event_notes, events.days_from_event_start").joins(:event_group).order("event_groups.event_group_name, events.days_from_event_start")
end
这可以很好地显示为一个包含两个表中的字段的列表
Event Group Name Description Location Notes DaysFrom1stEvent
Breeding Stud to serve Mare Stud Ranch Costa 0 Show Edit Destroy
Breeding Scan for pregnancy Vet None 14 Show Edit Destroy
Cycle Check 1st Cycle Check Stud Ranch None 0 Show Edit Destroy
等等……
单击“显示”时,目的是显示单行,但是当我尝试加入表并显示两个表中的字段时遇到问题。如果只显示事件字段,我没有问题,但我还想在显示视图中显示 event_group_name(例如:breeding)。
我尝试了很多不同的东西,目前的尝试如下:
class EventsController < ApplicationController
before_action :find_event_group, only: [ :show]
before_action :set_event, only: [:show, :edit, :update, :destroy]
def show
end
private
def find_event_group
@event_group = EventGroup.select("event_groups.id, event_groups.event_group_name").joins(:events).where('events.id = ?', params[:id])
end
def set_event
@event = Event.find(params[:id])
end
def event_params
params.require(:event).permit(:event_group_id, :event_description, :event_location, :event_notes, :days_from_event_start)
params.require(:event_group).permit(:event_group_name, events_attributes: [:id, :event_group_id])
end
end
show.html.erb 代码:
<%= render 'layouts/maintainheader' %>
<%= render 'layouts/referencefilesheader' %>
<p id="notice"><%= notice %></p>
<p>
<strong>event group:</strong>
<%= @event_group.event_group_name %>
</p>
<p>
<strong>Event description:</strong>
<%= @event.event_description %>
</p>
<p>
<strong>Event location:</strong>
<%= @event.event_location %>
</p>
<p>
<strong>Event notes:</strong>
<%= @event.event_notes %>
</p>
<p>
<strong>Days from event start:</strong>
<%= @event.days_from_event_start %>
</p>
<%= link_to 'New Event', new_event_path %> |
<%= link_to 'Edit', edit_event_path(@event) %> |
<%= link_to 'Back', events_path %>
我得到的错误是:“undefined method `event_group_name' for #
我也尝试过使用以下方法获取数据:
class EventsController < ApplicationController
before_action :set_event, only: [:show, :edit, :update, :destroy]
def show
end
private
def set_event
@events = Event.select("events.id, event_groups.event_group_name,events.event_description, events.event_location, events.event_notes, events.days_from_event_start").joins(:event_group).order("event_groups.event_group_name, events.days_from_event_start").where('events.id = ?', params[:id])
end
随着show.html.erb的变化:
<p>
<strong>event group:</strong>
<%= @event.event_group_name %>
</p>
我从这次尝试中得到的错误是:
"undefined method `event_group_name' for #<Event:"
有什么想法吗?我真的在为此苦苦挣扎 - 我已经阅读并重新阅读了 RonR 文档以及此处记录的许多其他问题,但无济于事......
提前谢谢你,
【问题讨论】:
-
EventGroup.select("event_groups.id, event_groups.event_group_name").joins(:events).where('events.id = ?', params[:id])应该是EventGroup.select("event_groups.id, event_groups.event_group_name").joins(:events).where('events.id = ?', params[:id]).first,我猜 -
根据您的代码
@event_group返回记录集合而不是单个记录。可能您应该遍历@event_group并显示event_group_name。 -
@event_group.event_group_name方法在哪里定义?不应该是@event.event_group.name吗? -
usmanali:这行得通,谢谢。我对为什么需要 .first 感到困惑,尽管因为只有一个事件记录具有 params[:id] 的事件 ID,并且只有一个事件组记录 =“breeding”。我认为它只会返回一条记录。??
-
Pavin:你说得对,但请看我对 usmanali 的评论。我不知道为什么它返回多个。我错过了一些东西....感谢您的回复
标签: ruby-on-rails rails-activerecord