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

时间:2014-12-29 14:58:00

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

我在尝试链接: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

3 个答案:

答案 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中的关系。

度过美好的一天!