我有一个用户填写表单,其中包含标题和正文。我还想传递存储在Cookie中的用户ID以及其他一些计算值。将散列传递给具有额外参数的控制器
在我创造我的控制器的部分我有以下代码:
@ticket = Ticket.new(params[:ticket])
@ticket.save
redirect_to ticket_path(@ticket)
我需要的Ticket.new调用后分配这些计算值或我可以通过这些与params哈希表莫名其妙一起?
我有一个用户填写表单,其中包含标题和正文。我还想传递存储在Cookie中的用户ID以及其他一些计算值。将散列传递给具有额外参数的控制器
在我创造我的控制器的部分我有以下代码:
@ticket = Ticket.new(params[:ticket])
@ticket.save
redirect_to ticket_path(@ticket)
我需要的Ticket.new调用后分配这些计算值或我可以通过这些与params哈希表莫名其妙一起?
既然则params的标签密钥只是一个哈希,你可以用合并来增加额外的键/值对
@ticket = Ticket.new(params[:ticket].merge({user_id: cookies[:user_id]}))
@ticket.save
redirect_to ticket_path(@ticket)
假设你使用的是Active关系和User
has_many :tickets
你也可以做这样的事情(本例假设current_user
由类似设计的东西定义)
@ticket = current_user.tickets.build(params[:ticket])
@ticket.save
redirect_to ticket_path(@ticket)
第二种方式使得它更清晰一点你正在尝试做的。
谢谢埃文。我是新来的铁轨,并没有运行构建方法。看起来它与'new'类似,但是通过使用外键的现有对象进行调用。那是对的吗? – Brian 2012-07-23 20:30:48
没问题。你是对的。 'build'是一个ActiveRecord :: Relation方法,而'new'(在你使用它的上下文中)是一个用于创建一个Class的新实例的Ruby方法。在Rails的最新版本中,'new'是ActiveRecord :: Relation中'build'的别名,所以你可以在'current_user.tickets'上下文中使用两个可互换的,但我更喜欢'build'。有几个很好的解释与新的构建。 – 2012-07-23 20:49:15
您可以在表单中使用f.hidden_field
来传递一些额外的计算值。
如果你想分配current_user
门票,最好是在单独的任务中,并保持它的保护。
除了能够将它包含在散列中之外,将它作为隐藏字段包含在表单中是否会有优势?我唯一担心的是查看源代码的人可能会看到user_id。 – Brian 2012-07-23 20:32:37
我试着在调用Ticket.new后分配这些值,它工作。有没有一种方法可以将它们包含在该调用中,以便稍微缩短代码? – Brian 2012-07-23 20:01:44