Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为登录用户保存记录时,用户ID为空_Mysql_Ruby On Rails_Session_Activerecord - Fatal编程技术网

Mysql 为登录用户保存记录时,用户ID为空

Mysql 为登录用户保存记录时,用户ID为空,mysql,ruby-on-rails,session,activerecord,Mysql,Ruby On Rails,Session,Activerecord,我开始学习rails,遇到了一个问题。我正在编写一个简单的应用程序(类似于我看到的twitter教程),其中用户登录并创建一个新帖子 当用户登录时,我设置会话信息如下 session[:id] = authorized_user.id session[:email] = authorized_user.email 现在我有了登录用户的ID。登录后,用户将进入一个表单,在该表单中他们可以提交一篇新文章(3个字段)。当用户单击“提交”时,我想用他们输入的数据创建一个新记录,并将该记

我开始学习rails,遇到了一个问题。我正在编写一个简单的应用程序(类似于我看到的twitter教程),其中用户登录并创建一个新帖子

当用户登录时,我设置会话信息如下

    session[:id] = authorized_user.id
    session[:email] = authorized_user.email
现在我有了登录用户的ID。登录后,用户将进入一个表单,在该表单中他们可以提交一篇新文章(3个字段)。当用户单击“提交”时,我想用他们输入的数据创建一个新记录,并将该记录与该用户(用户ID)相关联。我不知道该怎么做

以下是控制器上的代码:

def create
#Used for creating new status posts
#Need to get the ID of the user logged in
@user = AdminUser.find(session[:id])
#Instantiate new object using form parameters
@post = Post.new(post_params) 
@post.AdminUser = @user  # THIS IS THE LINE NOT WORKING
#Save the object
if @post.save
  #If save succeeds, redirect to the index action
  flash[:notice] = "Status has been saved"
  redirect_to(:action => 'index')
else
  #If the save fails, redisplay the form so user can fix problems
  render('new')
end
end
下面是post_参数的私有方法

def post_params
#Defining the params that are allowed to be passed with forms.
params.require(:post).permit(:post_status, :post_title, :post_content)
end 
记录已保存,但记录的用户ID为空


我的第一个建议是尝试将UserID作为post参数传递,但我认为这是一个潜在的安全风险,所以我正在尝试找出另一种方法。我相信这是一件简单的事情,我只是错过了它

像这样重写该行,将
UserID
作为
posts
表中的列名

@post.UserID = @user.id

属性

首先,

@post.AdminUser = @user  # THIS IS THE LINE NOT WORKING
您应该使用(您正在使用的)属性名。调用属性AdminUser有各种潜在的问题,这些问题会随之出现

称之为
admin\u user
admin\u id
或类似的名称

--

参数

第二,

我想用他们输入的数据创建一个新记录,然后 将记录与该用户关联(用户ID)

如果您试图保存对象的“相关”记录(例如,为
用户保存
post
),则必须自己分配
用户id
记录,并通过参数传递,如下所示:

#app/controllers/posts_controller.rb
Class PostsController < ApplicationController
    def create
         @post = Post.new(post_params)
         @post.save
    end

    private

    def post_params
        params.require(:post).permit(:title, :body).merge({user_id: authorized_user.id})
    end
end
从上面的示例可以看出,您基本上需要能够通过
user\u id
/
admin\u id
/
AdminUser
值发送到模型(这样它可以保存)

也可以通过如下示例设置属性来完成此操作:

#app/controllers/posts_controller.rb
def create
   @post = Post.new(post_params)
   @post.user_id = authorized_user.id
   @post.save
end

private

def post_params
    params.require(:post).permit(:title, :body, :user_id)
end
--


您还应该查看以获得登录用户对象的更好定义:)

您的
Post
模型中是否有
user\u id
属性?Post models admin\u user和Post还可以发布
提交
表单时生成的
日志,
授权用户的定义在哪里?谢谢Pavan-这绝对是我认为最适合这个问题的!是的!。是的。OP不应该像
UserID
@rich peck那样使用
CamelCase
——非常感谢您提供的信息。发布后不久,我确实将行改为:
@post.admin\u user\u id=@user
它不起作用。正如RSB所建议的,我需要在行中添加.id。不管怎样,我试图像你提到的那样改变这种情况,但是我得到了未定义的变量/方法错误。AdminUsers是表名,所以在CamelCase中引用它是否仍然不正确?此外,我将尝试其他方法来实现这一点,您也发布了这些方法。我感谢所有的投入。但愿我能把两个答案都标为正确。
#app/controllers/posts_controller.rb
def create
   @post = Post.new(post_params)
   @post.user_id = authorized_user.id
   @post.save
end

private

def post_params
    params.require(:post).permit(:title, :body, :user_id)
end