我有一个会议表,它有一个requester_id和requestee_id,它们都是用户ids (使用devise)。
create_table "meetings", force: :cascade do |t|
t.integer "requestor_id"
t.integer "requestee_id"
t.datetime "meeting_time"
t.boolean "accepted"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end调用requestor_id.first_name时:
视图
<tbody>
<% @meetings.each do |meeting| %>
<tr>
<td><%= meeting.requestor_id %></td>
<td><%= @requestor.first_name %></td>
<td><%= meeting.requestee_id %></td>
<td><%= meeting.meeting_time %></td>
<td><%= meeting.accepted %></td>
<td><%= link_to 'Show', meeting %></td>
<td><%= link_to 'Edit', edit_meeting_path(meeting) %></td>
<td><%= link_to 'Destroy', meeting, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>控制器
def show
@requestor = User.find(params[:requestor_id])
end它对nil:NilClass使用未定义的方法`first_name‘
我不确定这是否有任何关联,但当我搜索路线时,由于某种原因,所有会议都没有一条路可走。它只是说:
PUT /languages_users/:id(.:format) languages_users#update
DELETE /languages_users/:id(.:format) languages_users#destroy
GET /meetings(.:format) meetings#index
POST /meetings(.:format) meetings#create
GET /meetings/new(.:format) meetings#new
GET /meetings/:id/edit(.:format) meetings#edit
GET /meetings/:id(.:format) meetings#show
PATCH /meetings/:id(.:format) meetings#update
PUT /meetings/:id(.:format) meetings#update
DELETE /meetings/:id(.:format) meetings#destroy我的一些配置/runes.rb
Rails.application.routes.draw do
resources :meetings
resources :meetings
devise_for :users
root 'welcome#index'
endapp/model/meetings.rb
class Meeting < ActiveRecord::Base
has_many :users
end如何使用requestor_id中的整数和requestee_id调用User表。同样,从概念上讲,我在这里缺少或不理解什么?
提前感谢!
发布于 2015-11-02 00:12:31
我注意到在您提供的代码中有一些改进的机会。
首先,您似乎已经在路由文件中列出了两次resources :meetings。这可能是您在堆栈溢出问题中的复制粘贴错误,或者,如果这是实际代码,这可能就是为什么您说“由于某种原因没有会议路径”。
与此无关,让我们看看rake: routes的一个子集,特别是您的meetings#show路由:
GET /meetings/:id(.:format) meetings#show使用这个足智多谋的路径,您将得到params[:id]发送到您的控制器,在本例中,是会议的id。
现在,有一块让我困惑的东西。在您的视图代码中,您引用了@meetings,这使我认为这是索引视图,而不是显示视图,在这里我希望看到一个名为@meeting的变量。我现在要讨论你的表演动作。不过,我将在结尾部分圈回您的索引视图。
在“显示控制器”操作中,您的行是:
@requestor = User.find(params[:requestor_id])但是,您的路由没有为params哈希提供一个requestor_id,这意味着您正在调用User.find(nil)。有了写好的Controller代码,我希望您在点击show时会碰到一个类似于:ActiveRecord::RecordNotFound: Couldn't find User with 'id'=或类似的错误。
相反,你想要做的是找到你的会议,并根据发现的会议得到查询。
所以你可以在你的控制器里做这样的事情:
app/controllers/meetings_controller.rb
def show
@meeting = Meeting.find(params[:id])
@requestor = User.find(@meeting.requestor_id)
end...at这一点,我希望您的视图能够正确呈现。然而,有更多的Rails-y的方法来做这件事,这就带我去看你的会议模型。以下是我要定义的关系:
class Meeting < ActiveRecord::Base
belongs_to :requestor, class_name: "User"
belongs_to :requested, class_name: "User"
end来自 association
4.1.2.2 :class_name 如果不能从关联名称派生其他模型的名称,则可以使用:class_name选项提供模型名称。
除非您的用户模型有一个名为meeting_id的列,否则我怀疑您的Meeting.users关联没有连接起来做任何事情。
尽管您实际上没有一个名为Requestor的表,但我上面所写的关联仍然有效。相反,您可以指定请求者和请求者都只是特殊类型的用户。这样,您就不需要在Controller中定义@requestor,而只剩下.
app/controllers/meetings_controller.rb
def show
@meeting = Meeting.find(params[:id])
end
def index
@meetings = Meeting.all
end...and在你的索引视图(我告诉过你我会回来).
app/views/meetings/index.html.erb
<% @meetings.each do |meeting| %>
<tr>
<td><%= meeting.requestor.first_name %></td>
<td><%= meeting.requestee.first_name %></td>
<td><%= meeting.meeting_time %></td>
<td><%= meeting.accepted %></td>
<td><%= link_to 'Show', meeting %></td>...and等等..。
如果这有意义的话请告诉我!
发布于 2015-11-01 23:12:26
试着装货吗?
@meeting = Meeting.find(params:id).includes(:requestor)
@requestor = @meeting.requestor
https://stackoverflow.com/questions/33467417
复制相似问题