2013-05-13 68 views
56

在Rails 3,它可以插入像这样的属性到PARAMS:轨道4:插入属性PARAMS

params[:post][:user_id] = current_user.id 

我试图做同样的事情在Rails中4,但有没有运气:

post_params[:user_id] = current_user.id 

. . . . 


private 

    def post_params 
    params.require(:post).permit(:user_id) 
    end 

Rails忽略了这种插入。它不会抛出任何错误,它只是悄然失败。

回答

115

找到了答案here。您可以使用合并将其插入到params定义中,而不是从控制器操作中插入该属性。要在我前面的例子扩大:

private 

    def post_params 
    params.require(:post).permit(:some_attribute).merge(user_id: current_user.id) 
    end 
+3

谢谢,我需要使用deep_merge,因为我的属性被嵌套... – stephenmurdoch 2013-09-08 19:42:54

+0

@marflar你在params构造函数中使用了'deep_merge'?或者你的控制器的其他地方 – 2014-06-18 00:01:43

+0

这也是我的做法,但我一直在想,必须有一种方法来干这一点。我所有的50多名控制者在严格的参数区域都有类似的.merge声明。在我的情况下,我将current_user合并到updated_by中。我只在create方法中将current_user合并到created_by中。 – Dan 2014-07-31 16:17:24

27

除了@ timothycommoner的答案,则可以选择在每个动作基础上进行合并:

def create 
    @post = Post.new(post_params.merge(user_id: current_user.id)) 
    # save the object etc 
    end 

private 
    def post_params 
    params.require(:post).permit(:some_attribute) 
    end 
+1

嗨,你会怎么做一个嵌套资源? – Patient55 2015-11-11 16:57:13

+0

我不知道为什么,但@ timothycommoner的答案不适合我。只有这一个......我甚至尝试过“合并!”,但仍然失败。哦,这很容易读取,因为没有私人方法挖掘,并且在不同的使用情况下更容易更改 – james 2016-01-26 16:32:41

+0

@ Patient55我想你需要'deep_merge',因为他们在所选答案的评论中讨论过。 – Wit 2017-06-28 05:17:17

0

对于这种情况下的替代方法,可以通过scope需要通属性:

current_user.posts.create(post_params)