Rails关联模型中的User ID,为什么调用不到User的信息?
Rails User ID in an associated model, why can't I call the User's information?
我有一个会议 table,其中有一个 requester_id 和 requestee_id,它们都是用户 ID(使用设计)。
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”
我不确定这是否有任何相关性,但是当我搜索路线时,none 的会议出于某种原因有一个路径。它只是说:
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
我的一些 config/routes.rb
Rails.application.routes.draw do
resources :meetings
resources :meetings
devise_for :users
root 'welcome#index'
end
app/model/meetings.rb
class Meeting < ActiveRecord::Base
has_many :users
end
如何使用 requestor_id 和 requestee_id 中的整数调用用户 table。另外,从概念上讲,我在这里遗漏或不理解什么?
提前致谢!
尝试预先加载?
@meeting = Meeting.find(params[:id]).includes(:requestor)
@requestor = @meeting.requestor
我注意到您提供的代码有一些改进的机会。
首先,您似乎 resources :meetings
在您的路由文件中列出了两次。这可能是您在 Stack Overflow 问题中的 copy-paste 错误,或者,如果这是实际代码,这可能就是您说 "none of the meetings have a path for some reason."
的原因
独立于此,让我们看看您的 rake: routes
的子集,特别是您的 meetings#show
路线:
GET /meetings/:id(.:format) meetings#show
通过这条足智多谋的路线,您会 params[:id]
发送到您的控制器,在本例中,是会议 ID。
现在,有一件让我感到困惑。在您的视图代码中,您引用了 @meetings
,让我认为这是 index 视图,而不是 show 视图,其中我希望看到一个名为 @meeting
的变量。我现在要继续讨论你的表演动作。不过,最后我会回到你的索引视图。
在您的显示控制器操作中,您有以下行:
@requestor = User.find(params[:requestor_id])
但是,您的路由未向参数哈希提供 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
...此时我希望您的视图能够正确呈现。但是,还有更多 Rails-y 方法可以执行此操作,这会将我带到您的会议模型。以下是我要定义的关系:
class Meeting < ActiveRecord::Base
belongs_to :requestor, class_name: "User"
belongs_to :requested, class_name: "User"
end
来自 the Rails Guide for the belongs_to
association:
4.1.2.2 :class_name
If the name of the other model cannot be derived from the association
name, you can use the :class_name option to supply the model name.
除非你的用户模型有一个标题为 meeting_id
的列,否则我怀疑你的 Meeting.users
关联没有连接起来做任何事情。
即使您实际上没有 table 称为 Requestor,我在上面写的关联仍然有效。相反,您指定请求者和被请求者都是特殊类型的用户。这样,您根本不需要在 Controller 中定义 @requestor
,而是让您使用...
app/controllers/meetings_controller.rb
def show
@meeting = Meeting.find(params[:id])
end
def index
@meetings = Meeting.all
end
...在您的索引视图中(我告诉过您我会回来查看它)...
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>
...等等...
让我知道这是否有意义!
我有一个会议 table,其中有一个 requester_id 和 requestee_id,它们都是用户 ID(使用设计)。
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”我不确定这是否有任何相关性,但是当我搜索路线时,none 的会议出于某种原因有一个路径。它只是说:
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
我的一些 config/routes.rb
Rails.application.routes.draw do
resources :meetings
resources :meetings
devise_for :users
root 'welcome#index'
end
app/model/meetings.rb
class Meeting < ActiveRecord::Base
has_many :users
end
如何使用 requestor_id 和 requestee_id 中的整数调用用户 table。另外,从概念上讲,我在这里遗漏或不理解什么?
提前致谢!
尝试预先加载?
@meeting = Meeting.find(params[:id]).includes(:requestor)
@requestor = @meeting.requestor
我注意到您提供的代码有一些改进的机会。
首先,您似乎 resources :meetings
在您的路由文件中列出了两次。这可能是您在 Stack Overflow 问题中的 copy-paste 错误,或者,如果这是实际代码,这可能就是您说 "none of the meetings have a path for some reason."
独立于此,让我们看看您的 rake: routes
的子集,特别是您的 meetings#show
路线:
GET /meetings/:id(.:format) meetings#show
通过这条足智多谋的路线,您会 params[:id]
发送到您的控制器,在本例中,是会议 ID。
现在,有一件让我感到困惑。在您的视图代码中,您引用了 @meetings
,让我认为这是 index 视图,而不是 show 视图,其中我希望看到一个名为 @meeting
的变量。我现在要继续讨论你的表演动作。不过,最后我会回到你的索引视图。
在您的显示控制器操作中,您有以下行:
@requestor = User.find(params[:requestor_id])
但是,您的路由未向参数哈希提供 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
...此时我希望您的视图能够正确呈现。但是,还有更多 Rails-y 方法可以执行此操作,这会将我带到您的会议模型。以下是我要定义的关系:
class Meeting < ActiveRecord::Base
belongs_to :requestor, class_name: "User"
belongs_to :requested, class_name: "User"
end
来自 the Rails Guide for the belongs_to
association:
4.1.2.2 :class_name
If the name of the other model cannot be derived from the association name, you can use the :class_name option to supply the model name.
除非你的用户模型有一个标题为 meeting_id
的列,否则我怀疑你的 Meeting.users
关联没有连接起来做任何事情。
即使您实际上没有 table 称为 Requestor,我在上面写的关联仍然有效。相反,您指定请求者和被请求者都是特殊类型的用户。这样,您根本不需要在 Controller 中定义 @requestor
,而是让您使用...
app/controllers/meetings_controller.rb
def show
@meeting = Meeting.find(params[:id])
end
def index
@meetings = Meeting.all
end
...在您的索引视图中(我告诉过您我会回来查看它)...
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>
...等等...
让我知道这是否有意义!