【问题标题】:Couldn't find User without an ID - Ruby 2.1.4 / Rails 4.1.6找不到没有 ID 的用户 - Ruby 2.1.4 / Rails 4.1.6
【发布时间】:2014-12-29 14:58:00
【问题描述】:

我在尝试链接我的User 表和我的Room 表中的:username 时遇到错误。我使用设计进行了自定义身份验证并添加了:username

我希望username 成为设计中的User 表和我的Room 表之间的链接。

我正在尝试构建这个应用程序来重新创建一种 airbnb,但主要是作为我几个月前开始使用 ruby​​ 编程时的练习。

我得到错误:

ActiveRecord::RecordNotFound in RoomsController#new
Couldn't find User without an ID
line #19 @room.username = User.find(params[:username])

非常感谢您的帮助。我现在被困在这里几个小时了:-(

rooms_controller

def new
  @room = Room.new
  @room.username = User.find(params[:username]) #error seems to come from here
end

routes.rb

Rails.application.routes.draw do
  devise_for :users
  get "home/info"

  root :to => "home#info"

  resources :rooms

  resources :users do
  resources :rooms
end

room.rb

class Room < ActiveRecord::Base
  mount_uploader :photo, PictureUploader
  belongs_to :user
  validates_presence_of :username, :location, :description, :capacity, :price_day, :photo
end

user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  validates_presence_of :username
  validates_uniqueness_of :username

  has_many :rooms
end

【问题讨论】:

    标签: ruby-on-rails ruby activerecord devise params


    【解决方案1】:

    应该是这样的

    def new
      @room = Room.new
      @room.username = User.find_by_username(params[:username])
    end
    

    如果你只使用 .find() 它需要用户的 id。另见http://guides.rubyonrails.org/active_record_querying.html#dynamic-finders

    【讨论】:

    • 我认为 OP 对 RoR 来说是新的。你也应该用可能的变化来更新你的答案:即find_by(conditions)where(conditions).last
    • 我认为答案不应该包括 Rails 文档的副本。这就是为什么包含一个链接。他绝对是 Rails 的新手,而且他尝试做的事情似乎没有多大意义,但为了帮助解决这个问题,他需要更新他的问题
    【解决方案2】:

    您将@room.username 保存到用户对象中存在逻辑错误。您应该设置 @room.user = User.find_by(...) 或 @room.user_id = User.find_by(...).id

    如果您想获取用户名,活动记录会自动为您创建一个方法,即@room.user.username。

    现在,以下是查找用户的方法。

    @room = Room.new #Then either of the following
    
    @room.user = User.find_by(username: params[:username]) #Returns only one value
    
    @room.user = User.find_by_username(params[:username])  #Returns only one value
    
    @room.user = User.where(username: params[:username])   #Returns all users which meet condition.
    

    正如答案中已经提到的, User.find() 需要一个 ID。要知道的一件事是,所有以 .find 开头的用于活动记录的方法都会返回一条记录,即使许多方法都满足条件。

    如果您仍有任何问题,请向我们展示您的数据库架构,我们可以提供进一步的帮助。

    【讨论】:

      【解决方案3】:

      我找到了解决方案。 Room 是使用正确的 :username 创建的,用户看不到任何内容。 在我的房间控制器中,我保留了

      def new
      @room = Room.new end
      

      我在“def create”部分添加了这一行:

      def create
      @room = Room.new(room_params)
      @room.username = current_user.username
      

      感谢您的帮助,这有助于我更好地了解 Rails 中的关系。

      祝你有美好的一天!

      【讨论】:

        猜你喜欢
        • 2019-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        • 1970-01-01
        • 2015-01-01
        • 2012-05-24
        相关资源
        最近更新 更多