Rails 3:根据当前用户自动填写表单/数据库字段?

时间:2011-01-24 18:32:47

标签: ruby-on-rails ruby-on-rails-3

我的rails应用中有一个帖子模型,其中包含发件人的表单/数据库字段,我想自动填充 current_user 由Authlogic生成。基本上我想跟踪创建/发送“帖子”的人并且不允许他们更改该字段。

我尝试在下面的另一个StackOverflow问题中使用以下技巧,只要表单中有字段就可以使用。

def new
   @post = Post.new :sender => current_user.username

   respond_to do |format|
     format.html # new.html.erb
     format.xml  { render :xml => @post }
   end
end

我正在寻找的是一种在数据库中自动填充该值的方法,对用户隐藏,而不需要表单输入。

最好的方法是什么?

提前感谢您的帮助!

〜丹

3 个答案:

答案 0 :(得分:2)

听起来你应该在两者之间建立一个模型关系,或者就是你已经建立的模型关系。

在你的create方法中只需执行此操作

@post = current_user.posts.create(params[:post])

这不需要前端的字段,并强制用户和他们的帖子之间的关系

编辑评论

听起来你需要在post.rb中进行更改

belongs_to :user

belongs_to :sender, :class_name => "User"

编辑到架构

根据你的模型,你只是存储一个发送者/接收者的字符串,因为你需要做的就是这样:

in controller#create
@post = Post.create(params[:post])
@post.sender = current_user.username

编辑:如何正确地执行此操作

根据您的评论,您似乎希望以关系方式执行此操作,很好。

首先,您需要将发件人和收件人更改为整数,然后分别重命名为sender_id和receiver_id。

接下来,在您的user.rb模型中,您需要具备以下条件:

has_many :sent_posts, :foreign_key => "sender_id"
has_many :received_posts, :foreign_key => "receiver_id"

在post.rb模型中,您需要具备以下条件:

belongs_to :sender, :class_name => "User"
belongs_to :receiver, :class_name => "User"

现在,您可以在创建帖子时执行以下操作

@post = current_user.sent_posts.create(params[:post])

以下方法可用

@post.sender                #=> gets the sender
@post.receiver              #=> gets the receiver
current_user.sent_posts     #=> all posts from this user
current_user.received_posts #=> all posts for this user

注意我无法验证这一点,但我确信以上内容对您有用,可能会有一些轻微错误,因为我目前无法进行双重检查

答案 1 :(得分:0)

你总是可以让模型在before_create中添加该字段的值以及params ..这样可以确保在执行create语句之前添加该值..

答案 2 :(得分:0)

嗯..为什么不在create行动中这样做:

def create
  @post = Post.create(params[:post].merge({:sender => current_user.username}))
end