file_field在我的Rails表单中不粘

Ton*_*ony 3 forms ruby-on-rails

我有一个非常标准的Rails表单:

<div>
    <h1>Create a New Listing</h1>
    <%- form_for @listing, :html => {:multipart => true} do |f| -%>
                    <div><%= f.label :title, "Title:"%> <%= f.text_field :title %></div>
            <div>
                <%= f.label :image, "Image:" %> <%= f.file_field :image 
            </div>
            <div>
                <%= f.label :sound, "Sound Clip:"%> <%= f.file_field :sound %><br />
            </div>
        <div class="submit"><%= f.submit 'Post Listing' %></div>
    <%- end -%>
</div>
Run Code Online (Sandbox Code Playgroud)

当用户选择文件但表单因验证失败时,他必须始终重新选择该文件.它不粘.有关如何解决此问题的任何建议?

谢谢!

Ama*_*dan 6

我认为你不能让文件字段变粘.即使Rails提供初始值,大多数浏览器也会忽略它(否则,某些smart-aleck可能会将默认文件设置为/etc/passwd,如果你不注意,接下来就知道你的盒子是根的.

我能想到的最好的办法是设置一个标志,说明文件已经上传,所以如果用户没有选择另一个文件,请使用上次请求中已经发送的文件.

更新:你会惊讶于有多少人没有任何安全技能.我认识人们使用浏览器root.然而,"为什么"并不是一个问题 - 我试图做的重点只是它不是Rails的错,问题很可能在于浏览器的行为.

你可以阅读一篇文章说它比我更好...

更新2: "您的盒子已植根"应该说"用户的盒子已植根".我描述的场景是这样的:用户提交文件innocent.txt和CAPTCHA.恶意服务器响应CAPTCHA错误,再次输入,并隐蔽地将文件从更改innocent.txt~/.ssh/id_rsa.用户不查看文件字段(他已经在那里输入了正确的值),所以只需重做CAPTCHA并推送提交.现在服务器具有用户的私有SSH密钥.