我的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
我正在寻找的是一种在数据库中自动填充该值的方法,对用户隐藏,而不需要表单输入。
最好的方法是什么?
提前感谢您的帮助!
〜丹
答案 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