我在尝试链接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
感谢您的帮助,这有助于我更好地理解轨道中的关系。
有好的一天!