找不到没有 ID 的用户 - Ruby 2.1.4 / Rails 4.1.6



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

我希望username是 devise 的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

路线.rb

Rails.application.routes.draw do
  devise_for :users
  get "home/info"
  root :to => "home#info"
  resources :rooms
  resources :users do
  resources :rooms
end

房间.rb

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

用户.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
应该是

这样的

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

存在

一个逻辑错误,即您正在将 @room.username 保存到用户对象。您应该设置 @room.user = User.find_by(...)OR @room.user_id = User.find_by(...)。编号

活动记录将自动为您创建一个方法,如果您想获取用户名,该方法将是 @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 开头的活动记录方法都会返回单个记录,即使许多方法满足条件也是如此。

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

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

def new
@room = Room.new end

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

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

感谢您的帮助,这有助于我更好地理解轨道中的关系。

有好的一天!

最新更新