file_field在我的Rails表单中不粘

时间:2010-06-10 03:47:18

标签: ruby-on-rails forms

我有一个非常标准的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>

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

谢谢!

1 个答案:

答案 0 :(得分:6)

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

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

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

你可以阅读an article说得比我更好......

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