2012-12-11 21 views
8

tôi đã sử dụng kẹp giấy để đính kèm một avatar vào người dùng của tôi, trong Model của tôi:Rails kẹp giấy, Chỉnh sửa hình thức file_field không được gán

has_attached_file :avatar, 
    :styles => {square_tiny: '50x50#', square_small: '100x100#', square: '200x200#'} 

Tôi có một hình thức

<%= form_for(@user_profile, 
     :url => { :controller => :user_profiles, :action => :update_general_info, :id => @user_profile.id }, 
      :html => { :multipart => true, 
       :class=> "form-horizontal" }) do |f| %> 

      <div class="control-group"> 
       <%= f.label :avatar, :class => "control-label" %> 
       <div class="controls"> 
        <%= f.file_field :avatar %> 
       </div> 
      </div> 

.... 

<% end %> 

Việc tải hoạt động hoàn hảo, nhưng Tôi quay lại và CHỈNH SỬA người dùng của tôi, trường tệp cho biết 'không có tệp được chọn'. Và kể từ khi tôi xác nhận sự hiện diện của avatar đó, mỗi lần người dùng chỉnh sửa chi tiết của mình, anh ấy phải tải lại hình đại diện của mình lên ...

Làm cách nào để giải quyết vấn đề này?

Tôi nghĩ rằng :multipart => true sẽ giúp ích nhưng không.

+0

Bạn đã giải quyết được sự cố này chưa? –

Trả lời

5

Hoàn toàn không có cách nào tốt cho một trang để đặt giá trị cho trường tệp và đó là vì lý do bảo mật.

Nếu trình duyệt cho phép trang hoặc tập lệnh JS đặt giá trị cho trường tệp sẽ cho phép trang độc hại đặt trước giá trị trường tệp bằng một số tệp hệ thống hoặc mật khẩu. Và đó sẽ là một lỗ hổng bảo mật lớn.

Điều tôi làm trong trường hợp đó là tôi hiển thị tệp đã lưu dưới dạng liên kết mà người dùng có thể nhấp để tải xuống. Sau đó bạn có thể cung cấp ít liên kết AJAX để xóa (tệp bị xóa bằng cuộc gọi AJAX và liên kết được thay bằng đầu vào tệp mới) và thay thế (liên kết được thay bằng đầu vào tệp).

Tùy chọn cuối cùng của bạn sẽ là sử dụng AJAX để tải tệp lên. Nếu bạn sử dụng AJAX để tải tệp lên, bạn sẽ POST vào một khung ẩn để đầu vào tệp sẽ giữ giá trị được chọn của nó. Dù bằng cách nào, hãy nhớ rằng bất kỳ thay đổi nào đối với giá trị trường tệp phải được người dùng bắt đầu.

Các vấn đề liên quan