Controller#Create - 找不到 'id'= 的用户
Controller#Create - Couldn't find User with 'id'=
我正在学习 web-dev 和 rails 并且已经在这上面停留了几天。
我有两个模型 - User
和 Property
并且建立了我认为正确的关联。
我想做的是只允许在 user
登录时创建 property
,并且 property
属于 user
].我得到的部分符号,但是当我去创建 属性 时,它给了我 "Couldn't find User..."
错误。
我用了一个DB SQL Browser
来验证有用户,有用户ID,所以不明白为什么登录时找不到。
感谢任何帮助。
控制器:
class PropertiesController < ApplicationController
before_action :authenticate_user!, only: [:new]
def index
@properties = Property.all
end
def new
@property = Property.new
end
def create
@user = User.find(params[:user_id])
@property = @user.properties.new(property_params)
respond_to do |format|
if @property.save
format.html { redirect_to @property, notice: 'Property was successfully created.' }
format.json { render :show, location: @property}
else
format.html { render :new }
format.json
end
end
end
def show
@property = Property.find(params[:id])
end
def edit
end
def update
end
def destroy
end
private
def property_params
params.require(:property).permit(:street, :city, :province, :postal_code, :description, :picture)
end
end
数据库:
ActiveRecord::Schema.define(version: 20160204211556) do
create_table "properties", force: :cascade do |t|
t.string "street"
t.string "city"
t.string "province"
t.string "postal_code"
t.text "description"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "property_id"
t.string "picture"
t.integer "user_id"
end
add_index "properties", ["property_id"], name: "index_properties_on_property_id", unique: true
add_index "properties", ["user_id"], name: "index_properties_on_user_id"
create_table "users", force: :cascade do |t|
t.string "name"
t.string "email"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "password_digest"
t.string "remember_digest"
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
end
add_index "users", ["email"], name: "index_users_on_email", unique: true
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
型号:
class Property < ActiveRecord::Base
belongs_to :user, dependent: :destroy
mount_uploader :picture, PictureUploader
end
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :properties
end
如果您能提供您的 routes.rb
和错误消息,那就太好了。
我的猜测是,由于您在属性控制器中执行 @user = User.find(params[:user_id])
,您的 user_id 不在参数中,因此 rails 无法找到 user_id。
在你的routes.rb
中,你可能需要
resources :users do
resources :properties
end
这样 link 就会变成 localhost:3000/users/1/properties/new
和 rails 可以找到 user_id.
为什么不用
@user = User.new(user_permit)
在您的 def 上创建
然后将其添加到控制器的底部
private
def user_permit
params[:user].permit!
end
使用这个:
#config/routes.rb
resources :properties # -> url.com/properties/new
#app/controllers/properties_controller.rb
class PropertiesController < ApplicationController
before_action :authenticate_user! #-> assuming you're using devise
def new
@property = current_user.properties.new
end
def create
@property = current_user.properties.new property_params
respond_to do |format|
if @property.save
format.html { redirect_to @property, notice: 'Property was successfully created.' }
format.json { render :show, location: @property}
else
format.html { render :new }
format.json
end
end
end
private
def property_params
params.require(:property).permit(:street, :city, :province, :postal_code, :description)
end
end
#app/views/properties/new.html.erb
<%= form_for @property do |f| %>
<%= f.text_field :street %>
<%= f.text_field :city %>
<%= f.text_field :province %>
<%= f.text_field :postal_code %>
<%= f.text_field :description %>
<%= f.submit %>
<% end %>
这将为 current_user
(assuming you're using Devise
创建一个新的 属性 用于身份验证)
我正在学习 web-dev 和 rails 并且已经在这上面停留了几天。
我有两个模型 - User
和 Property
并且建立了我认为正确的关联。
我想做的是只允许在 user
登录时创建 property
,并且 property
属于 user
].我得到的部分符号,但是当我去创建 属性 时,它给了我 "Couldn't find User..."
错误。
我用了一个DB SQL Browser
来验证有用户,有用户ID,所以不明白为什么登录时找不到。
感谢任何帮助。
控制器:
class PropertiesController < ApplicationController
before_action :authenticate_user!, only: [:new]
def index
@properties = Property.all
end
def new
@property = Property.new
end
def create
@user = User.find(params[:user_id])
@property = @user.properties.new(property_params)
respond_to do |format|
if @property.save
format.html { redirect_to @property, notice: 'Property was successfully created.' }
format.json { render :show, location: @property}
else
format.html { render :new }
format.json
end
end
end
def show
@property = Property.find(params[:id])
end
def edit
end
def update
end
def destroy
end
private
def property_params
params.require(:property).permit(:street, :city, :province, :postal_code, :description, :picture)
end
end
数据库:
ActiveRecord::Schema.define(version: 20160204211556) do
create_table "properties", force: :cascade do |t|
t.string "street"
t.string "city"
t.string "province"
t.string "postal_code"
t.text "description"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "property_id"
t.string "picture"
t.integer "user_id"
end
add_index "properties", ["property_id"], name: "index_properties_on_property_id", unique: true
add_index "properties", ["user_id"], name: "index_properties_on_user_id"
create_table "users", force: :cascade do |t|
t.string "name"
t.string "email"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "password_digest"
t.string "remember_digest"
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
end
add_index "users", ["email"], name: "index_users_on_email", unique: true
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
型号:
class Property < ActiveRecord::Base
belongs_to :user, dependent: :destroy
mount_uploader :picture, PictureUploader
end
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :properties
end
如果您能提供您的 routes.rb
和错误消息,那就太好了。
我的猜测是,由于您在属性控制器中执行 @user = User.find(params[:user_id])
,您的 user_id 不在参数中,因此 rails 无法找到 user_id。
在你的routes.rb
中,你可能需要
resources :users do
resources :properties
end
这样 link 就会变成 localhost:3000/users/1/properties/new
和 rails 可以找到 user_id.
为什么不用
@user = User.new(user_permit)
在您的 def 上创建
然后将其添加到控制器的底部
private
def user_permit
params[:user].permit!
end
使用这个:
#config/routes.rb
resources :properties # -> url.com/properties/new
#app/controllers/properties_controller.rb
class PropertiesController < ApplicationController
before_action :authenticate_user! #-> assuming you're using devise
def new
@property = current_user.properties.new
end
def create
@property = current_user.properties.new property_params
respond_to do |format|
if @property.save
format.html { redirect_to @property, notice: 'Property was successfully created.' }
format.json { render :show, location: @property}
else
format.html { render :new }
format.json
end
end
end
private
def property_params
params.require(:property).permit(:street, :city, :province, :postal_code, :description)
end
end
#app/views/properties/new.html.erb
<%= form_for @property do |f| %>
<%= f.text_field :street %>
<%= f.text_field :city %>
<%= f.text_field :province %>
<%= f.text_field :postal_code %>
<%= f.text_field :description %>
<%= f.submit %>
<% end %>
这将为 current_user
(assuming you're using Devise
创建一个新的 属性 用于身份验证)