首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关联模型中的Rails用户ID,为什么我不能调用用户的信息?

关联模型中的Rails用户ID,为什么我不能调用用户的信息?
EN

Stack Overflow用户
提问于 2015-11-01 21:26:12
回答 2查看 448关注 0票数 0

我有一个会议表,它有一个requester_id和requestee_id,它们都是用户ids (使用devise)。

代码语言:javascript
复制
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时:

视图

代码语言:javascript
复制
<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>

控制器

代码语言:javascript
复制
 def show
  @requestor = User.find(params[:requestor_id])
 end

它对nil:NilClass使用未定义的方法`first_name‘

我不确定这是否有任何关联,但当我搜索路线时,由于某种原因,所有会议都没有一条路可走。它只是说:

代码语言:javascript
复制
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

代码语言:javascript
复制
  Rails.application.routes.draw do
   resources :meetings
   resources :meetings

   devise_for :users

   root 'welcome#index'
  end

app/model/meetings.rb

代码语言:javascript
复制
  class Meeting < ActiveRecord::Base
   has_many :users
  end

如何使用requestor_id中的整数和requestee_id调用User表。同样,从概念上讲,我在这里缺少或不理解什么?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-02 00:12:31

我注意到在您提供的代码中有一些改进的机会。

首先,您似乎已经在路由文件中列出了两次resources :meetings。这可能是您在堆栈溢出问题中的复制粘贴错误,或者,如果这是实际代码,这可能就是为什么您说“由于某种原因没有会议路径”。

与此无关,让我们看看rake: routes的一个子集,特别是您的meetings#show路由:

代码语言:javascript
复制
GET    /meetings/:id(.:format)                      meetings#show

使用这个足智多谋的路径,您将得到params[:id]发送到您的控制器,在本例中,是会议的id。

现在,有一块让我困惑的东西。在您的视图代码中,您引用了@meetings,这使我认为这是索引视图,而不是显示视图,在这里我希望看到一个名为@meeting的变量。我现在要讨论你的表演动作。不过,我将在结尾部分圈回您的索引视图。

在“显示控制器”操作中,您的行是:

代码语言:javascript
复制
@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

代码语言:javascript
复制
def show
  @meeting = Meeting.find(params[:id])
  @requestor = User.find(@meeting.requestor_id)
end

...at这一点,我希望您的视图能够正确呈现。然而,有更多的Rails-y的方法来做这件事,这就带我去看你的会议模型。以下是我要定义的关系:

代码语言:javascript
复制
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

代码语言:javascript
复制
def show
  @meeting = Meeting.find(params[:id])
end

def index
  @meetings = Meeting.all
end

...and在你的索引视图(我告诉过你我会回来).

app/views/meetings/index.html.erb

代码语言:javascript
复制
 <% @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等等..。

如果这有意义的话请告诉我!

票数 2
EN

Stack Overflow用户

发布于 2015-11-01 23:12:26

试着装货吗?

@meeting = Meeting.find(params:id).includes(:requestor)

@requestor = @meeting.requestor

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33467417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档