我在尝试链接:username
表格和User
表格中的Room
时遇到错误。我用设计制作了一个自定义身份验证并添加了: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
答案 0 :(得分:2)
它应该是这样的
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
答案 1 :(得分:0)
将@ 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为活动记录开头的方法都会返回单个记录,即使许多方法符合条件。
如果您仍然遇到任何问题,请向我们展示您的数据库架构,我们可以提供进一步的帮助。
答案 2 :(得分:0)
我找到了解决方案。使用右侧:用户名创建会议室,用户不会看到任何内容。 在我的房间控制器中,我保持
def new
@room = Room.new end
我在“def create”部分添加了这一行:
def create
@room = Room.new(room_params)
@room.username = current_user.username
感谢您的帮助,这有助于我更好地了解rails中的关系。
度过美好的一天!