2012-07-23 99 views
0

我有一个用户填写表单,其中包含标题和正文。我还想传递存储在Cookie中的用户ID以及其他一些计算值。将散列传递给具有额外参数的控制器

在我创造我的控制器的部分我有以下代码:

@ticket = Ticket.new(params[:ticket]) 
@ticket.save 
redirect_to ticket_path(@ticket) 

我需要的Ticket.new调用后分配这些计算值或我可以通过这些与params哈希表莫名其妙一起?

+0

我试着在调用Ticket.new后分配这些值,它工作。有没有一种方法可以将它们包含在该调用中,以便稍微缩短代码? – Brian 2012-07-23 20:01:44

回答

3

既然则params的标签密钥只是一个哈希,你可以用合并来增加额外的键/值对

@ticket = Ticket.new(params[:ticket].merge({user_id: cookies[:user_id]})) 
@ticket.save 
redirect_to ticket_path(@ticket) 

假设你使用的是Active关系和Userhas_many :tickets你也可以做这样的事情(本例假设current_user由类似设计的东西定义)

@ticket = current_user.tickets.build(params[:ticket]) 
@ticket.save 
redirect_to ticket_path(@ticket) 

第二种方式使得它更清晰一点你正在尝试做的。

+0

谢谢埃文。我是新来的铁轨,并没有运行构建方法。看起来它与'new'类似,但是通过使用外键的现有对象进行调用。那是对的吗? – Brian 2012-07-23 20:30:48

+0

没问题。你是对的。 'build'是一个ActiveRecord :: Relation方法,而'new'(在你使用它的上下文中)是一个用于创建一个Class的新实例的Ruby方法。在Rails的最新版本中,'new'是ActiveRecord :: Relation中'build'的别名,所以你可以在'current_user.tickets'上下文中使用两个可互换的,但我更喜欢'build'。有几个很好的解释与新的构建。 – 2012-07-23 20:49:15

0

您可以在表单中使用f.hidden_field来传递一些额外的计算值。

如果你想分配current_user门票,最好是在单独的任务中,并保持它的保护。

+0

除了能够将它包含在散列中之外,将它作为隐藏字段包含在表单中是否会有优势?我唯一担心的是查看源代码的人可能会看到user_id。 – Brian 2012-07-23 20:32:37

相关问题