【问题标题】:Controller#Create - Couldn't find User with 'id'=Controller#Create - 找不到具有 'id'= 的用户
【发布时间】:2016-02-04 23:16:00
【问题描述】:

我正在学习 web-dev 和 rails 并且已经被困了几天。

我有两个模型 - UserProperty 并且有我认为正确的设置关联。

我要做的只是在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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 associations


    【解决方案1】:

    使用这个:

    #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 创建一个新属性(假设您使用Devise 进行身份验证)

    【讨论】:

    • 谢谢瑞克。在创建中编辑了一个部分以解决另一个错误,但从概念上讲,您提供的所有内容都让我朝着正确的方向前进。欣赏它。
    【解决方案2】:

    如果您能提供您的routes.rb 和错误消息,那就太好了。

    我的猜测是,由于您在属性控制器中执行 @user = User.find(params[:user_id]),因此您的 user_id 不存在于参数中,因此 rails 无法找到 user_id。

    在你的routes.rb,你可能需要

    resources :users do 
       resources :properties
    end
    

    这样链接就会变成localhost:3000/users/1/properties/new 这样的链接,并且rails 可以找到user_id。

    【讨论】:

      【解决方案3】:

      为什么不使用

      @user = User.new(user_permit)
      

      在你的 def 创建

      然后将其添加到控制器的底部

      private
      def user_permit
          params[:user].permit!
      end
      

      【讨论】:

        猜你喜欢
        • 2016-10-19
        • 1970-01-01
        • 1970-01-01
        • 2015-07-15
        • 1970-01-01
        • 2015-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多