Rails 3 и скрепка при выпуске метода обновления - PullRequest
3 голосов
/ 19 января 2011

Скрепка работает хорошо, чтобы сохранить аватар пользователя, но я обнаружил проблему при обновлении.

На мой взгляд, если у пользователя есть изображение, сохраненное в модели, он покажет тег изображения с текущим изображением.рядом с полем загрузки файла, чтобы вы могли видеть, какой у вас текущий аватар.

Если изображение не изменилось, но проверка модели не удалась (например, имя_первого имени), исходное отображаемое изображение исчезает, что означает, что пользователь либодолжен исправить ошибку и повторно выбрать изображение и отправить (обновить) или вернуться и начать заново без ошибки.Есть идеи?Заранее спасибо.

Вот код:

Модель

class User < ActiveRecord::Base

  # Validation
  validates :first_name, :presence => true

  # Paperclip
  has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "70x70#" }

end

Контроллер

...
  # GET /users/1/edit
  def edit
    @user = User.find(params[:id])
  end

  # POST /users
  # POST /users.xml
  def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save
        format.html { redirect_to(@user, :notice => 'User was successfully created.') }
        format.xml  { render :xml => @user, :status => :created, :location => @user }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /users/1
  # PUT /users/1.xml
  def update
    @user = User.find(params[:id])

    respond_to do |format|
      if @user.update_attributes(params[:user])
        format.html { redirect_to(@user, :notice => 'User was successfully updated.') }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end
...

Вид

<%= form_for @user, :html => {:multipart => true} do |f| %>
  <div class="row text">
    <%= f.label :first_name %>
    <div class="field">
      <%= f.text_field :first_name %>
    </div>
  </div>
  <div class="row">
    <%= f.label :avatar %>
    <div class="field">
      <%= image_tag @user.avatar.url(:thumb) %>
    </div>
    <div class="field" id="avatar_upload">
      <%= f.file_field :avatar %>
    </div>
  </div>
  <div class="row actions"><%= f.submit %> or <%= link_to 'cancel', users_path %>.</div>
<% end %>

1 Ответ

3 голосов
/ 19 января 2011

Это происходит из-за того, что ваша форма отправляет 'nil' на сервер (из-за того, что поле пустое, поскольку новый аватар не загружается), когда ваша страница отправляет запрос POST на ваш сервер.Если не брать в расчет скрытые временные поля, есть несколько способов:

  • Проверка на стороне клиента.Запретите отправку вашей страницы, если что-то не так, и вы не в конечном итоге достигнете ошибки проверки на стороне сервера, которая приведет к отсутствию изображения.
  • Переместите поле аватара в отдельный объект FORM на той же странице,обрабатывает только аватар.Это гарантирует, что страница отправляет информацию об аватаре только в сообщении POST, если оно связано с фактическим редактированием аватара.
  • Переместите функцию загрузки / обновления аватара на полностью отдельную страницу, которая обрабатывает только аватар.Это работает по той же причине, что и вышеупомянутая.
...