访问Devise成员编辑视图时删除头像

时间:2013-07-29 14:16:29

标签: devise carrierwave updates nested-attributes

我有一个恼人的问题。我正在构建一个具有成员模型的简单社交网络。我使用Devise进行身份验证,使用CanCan进行授权。 我还创建了一个Avatar模型,它与Member模型有一对一的关系。我使用Carrierwave上传头像。 一切正常,在成功进行个人资料编辑后,当我访问个人资料节目或索引视图(里面的视图/成员文件夹)时,我可以看到上传的头像。但是,当我再次访问配置文件编辑页面时,它会消失(并且也会从uploads文件夹中删除),而不会故意删除它而不保存编辑表单。

我导入了所有设计视图,以便能够对它们进行调整。

我使用views / members / registrations / edit.html.erb作为成员个人资料编辑视图,我在其中有这个表单:

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
          <%= devise_error_messages! %>
            <div class="invisible">
              <%= resource.build_avatar %>
            </div>
            <div id="avatar">
              <figure id="avatar_pic">
                <% if @member.avatar.nil? %>
                <img src="/assets/profile_pic.gif" alt="<%= @member.name %>">
                <% else %>
                  <%= image_tag(@member.avatar.avatar_url, :alt => "#{@member.name}") %>
                <% end %>
                <%= f.fields_for :avatar do |avatar| %>
                  <%= avatar.file_field :avatar %>
                <% end %>
              </figure>
              <div id="user_data">
                <%= f.text_field :name, :autofocus => true %>
                <p><%= f.text_field :age, :placeholder => "Életkor" %></p>
                <p><%= f.text_field :city, :placeholder => "Település" %></p>
                <p><%= f.text_field :job, :placeholder => "Foglalkozás" %></p>
              </div>
            </div>
            <div id="user_status">
              <div id="kms">
                <p id="finish_date">2013. október 31.</p>
                <%= f.text_field :kms %> <br>
                <%= f.text_field :amount %>
                <%= f.password_field :current_password, :placeholder => "Mentéshez adja meg jelszavát!" %>
              </div>
              <%= f.submit "Save" %>
            </div>
          <% end %>

我还导入了Devise RegistrationsController,因为我需要对一些事情进行调整。例如,实现jCrop。 它现在看起来像这样:

class Members::RegistrationsController < Devise::RegistrationsController
      before_filter :check_permissions, :only => [:update]
      skip_before_filter :require_no_authentication

      def check_permissions
        authorize! :update, resource
      end

      def create
        super
      end

      def update
        super
      end
end

我的会员模型看起来像这样(我在has_one:avatar之后有依赖销毁,但删除它以测试导致问题,但似乎没有):

class Member < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_permalink :name
  has_one :avatar
  accepts_nested_attributes_for :avatar
  attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :kms, :amount, :age, :job, :city, :why, :permalink, :avatar_attributes
  validates_uniqueness_of :email
end

我在之前上传头像时访问会员编辑页面时的消息:

ActionController::RoutingError (No route matches [GET] "/assets"):
  actionpack (3.2.13) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
  railties (3.2.13) lib/rails/rack/logger.rb:32:in `call_app'
  railties (3.2.13) lib/rails/rack/logger.rb:16:in `block in call'
  activesupport (3.2.13) lib/active_support/tagged_logging.rb:22:in `tagged'
  railties (3.2.13) lib/rails/rack/logger.rb:16:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/request_id.rb:22:in `call'
  rack (1.4.5) lib/rack/methodoverride.rb:21:in `call'
  rack (1.4.5) lib/rack/runtime.rb:17:in `call'
  activesupport (3.2.13) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
  rack (1.4.5) lib/rack/lock.rb:15:in `call'
  actionpack (3.2.13) lib/action_dispatch/middleware/static.rb:63:in `call'
  railties (3.2.13) lib/rails/engine.rb:479:in `call'
  railties (3.2.13) lib/rails/application.rb:223:in `call'
  rack (1.4.5) lib/rack/content_length.rb:14:in `call'
  railties (3.2.13) lib/rails/rack/log_tailer.rb:17:in `call'
  rack (1.4.5) lib/rack/handler/webrick.rb:59:in `service'
  /usr/local/rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/webrick/httpserver.rb:138:in `service'
  /usr/local/rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/webrick/httpserver.rb:94:in `run'
  /usr/local/rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/webrick/server.rb:295:in `block in start_thread'


  Rendered /usr/local/rvm/gems/ruby-2.0.0-p0/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (0.9ms)

当我访问会员编辑页面时,任何想法为什么Rails删除(从数据库和服务器)阿凡达?

祝福, 马特

1 个答案:

答案 0 :(得分:1)

确定。似乎我想出来了。需要将下面的代码放在devise registrations_controller.rb。

def edit
    resource.avatar || resource.build_avatar
    super
end