如何在Rails强参数中包含HTML输入?

时间:2018-08-19 17:53:53

标签: html ruby-on-rails ruby input strong-parameters

我正在尝试创建具有以下强参数的模型“ Post”的实例:

  private

    def post_params
      params.require(:post).permit(:name, {images: []})
    end

在我的表单中,这就是将文件上传到post_params["images"]并因此上传到post.images的方式:

<%= f.file_field :images, multiple: true %>

但是我想对上载按钮应用自定义样式,因此我使用HTML构建样式。但是我不知道要提供输入的name属性是什么,以便将其包含在post_params中。这是我尝试过的:

<input name="images" type="file" multiple="true"/>
<input name="post[images]" type="file" multiple="true"/>
<input name="post['images']" type="file" multiple="true"/>
<input name=":images" type="file" multiple="true"/>

但是他们都只是去params["post"]["images"],而不是strong_params

我可以给HTML输入什么名称,使其包含在强大的参数中?

1 个答案:

答案 0 :(得分:1)

类似这样的东西:

<input multiple="multiple" name="post[images][]" id="posts_images" type="file">

这应该生成您的控制器期望的正确JSON参数。它可能与哈希/数组的多个级别混淆。这就是为什么我在上面的评论中提到的在浏览器中使用inspect element来查看Rails生成的内容的原因,然后可以构建自定义样式的元素来满足自己的需求。

一种记住它的方法是:require进入post,然后寻找键为images并且值为array的哈希。这样,就更容易知道在何处使用单数或复数,关键是什么等。因此,将其语法映射为:

<model name>[<key defined in strong params>][]
.erb版本的

中,如果您查看表单的顶部,请考虑f... do |f|的值。在那儿,它获得控制器名称post(单数),然后在:images中为其赋予方法名称file_field(复数)。根据Rails Docs的说法,您可以使用单数:image,但复数对我来说似乎更正确。