2014-05-07 71 views
1

我开始学习rails并遇到问题。我正在写一个简单的应用程序(类似于我见过的twitter教程),用户登录并创建一个新帖子。保存登录用户的记录时,用户ID为NULL

当用户登录时,我设置的会话信息,所以,现在我已经登录的用户的ID如下

session[:id] = authorized_user.id 
    session[:email] = authorized_user.email 

。登录后,用户被带到一种形式,他们可以提交新帖子(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_params

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 

保存记录,但该记录的用户名是空的私有方法。

我的第一个尝试是试图通过UserID作为后置参数,但我认为这是一个潜在的安全风险,所以我试图找出一种替代方法。我相信这是简单的,我只是想念它。

+0

您的'Post'模型中是否有'user_id'属性? – Pavan

+0

发布模型admin_user和发布 – RSB

+0

同时发布''提交''表单'时生成的'log'。 – Pavan

回答

0

改写这样的路线,以UserID作为列名posts

@post.UserID = @user.id 
1

属性

首先,

@post.AdminUser = @user # THIS IS THE LINE NOT WORKING 

您应该使用snake_case您的属性名称(您正在使用CamelCase)。调用一个AdminUser属性会产生各种潜在的问题,这些问题将会出现。

说它admin_useradmin_id或类似的东西

-

PARAMS

其次,

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

如果你想保存一个“依赖”记录的对象(例如,节省了user一个post),你必须给自己分配user_id记录,并使其通过PARAMS ,像这样:

#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 

当您在您的应用程序的元素,你基本上是刚刚从params哈希表&发送到模型保存获取数据。这是使用strong_params功能中的Rails 4引入的完成:

def post_params 
     params.require(:post).permit(:title, :body).merge({user_id: authorized_user.id}) 
    end 

你可以从我上面的例子中看到的,你基本上需要能够通过通过user_id/admin_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 

-

您还应该查看difference between authentication & autorhization以更好地定义您登录的用户对象:)

+0

提到'user_id'.这是要走的路:) :) – Pavan

+0

谢谢帕文 - 这绝对是最适合我认为的问题 –

+0

是的!它是。和OP不应该使用像CamelCase一样'UserID'。 – Pavan