当我更新我的头像图片时,它会更改所有用户图片

时间:2015-08-19 15:47:57

标签: ruby-on-rails ruby avatar

我似乎在我的代码中出错了。我一直在看我过去的两个项目,其中一个我有一个图片表来将picture_id与用户关联,但是在一个不同的项目中它甚至不需要,我忘了我是怎么做到的。我的代码中有任何改进建议和错误原因,我们将不胜感激,谢谢。

架构

<div id="profile_to">
 <div class="profile_background_picture">
  <%= image_tag current_user.background.url(:medium) %>
 </div>
 <div class="profile_picture">
  <%= image_tag current_user.avatar.url(:medium) %>
 </div>
</div>

用户/显示

<% if current_user %>
 <div id="login_top">
  <a href="/"><p class="logo">Trend</p></a>
  <nav>
   <div class="loginout">
    <%= link_to ("LOGOUT"), "/sessions/new",method: :delete %>
   </div>
   <div class="user-links">
    <a href="/users/<%= current_user.id %>">
     <% if current_user.user_name.present? %>
      <%= link_to current_user.user_name, user_path(current_user) %>
     <% else %>
      <%= current_user.first_name %>
     <% end %>
    </a>
    &nbsp;<b class="size">|</b>&nbsp;
    <a href="">Settings</a>
    &nbsp;<b class="size">|</b>&nbsp;
   </div>
   <% if current_user.avatar.present? %>
    <div class="circular">
     <%= image_tag current_user.avatar.url(:medium) %>
    </div>
   <% else %>     
   <% end %>
  </nav>
 </div> 
<% end %>

<%= form_for current_user, :html => { :multipart => true } do |f| %>
  <p class="editpage">Profile Picture: <%= f.file_field :avatar %></p>
  <%= f.submit "Upload" %>
<% end %>

用户/索引

has_attached_file :avatar, :styles => {
 :medium => "200x200>",
 :small => "120x120#",
 :thumb => "75x75#",
 :default_url => "http://www.adtechnology.co.uk/images/UGM-default-user.png"
}

validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/

has_attached_file :background, :styles => {
 :medium => "200x200>",
 :small => "120x120#",
 :thumb => "75x75#",
 :default_url => "http://www.adtechnology.co.uk/images/UGM-default-user.png"
}

validates_attachment_content_type :background, :content_type => /\Aimage\/.*\Z/

用户模型

def index
 @user = User.new
 @users = User.all
end

def create
@user = User.new(user_params)
 if @user.save
  session[:user_id] = @user.id
  cookies[:user_id] = @user.id
  flash[:notice] = "Successfully Registerd"
  redirect_to "/"
 else
  flash[:alert] = @user.errors.full_messages
  redirect_to "/"
 end
end

def new
 @user = User.new
end

def edit
 @user = User.friendly.find(params[:id])
 current_user
end

def show
 @user = User.friendly.find(params[:id])
 current_user
end

def update
 @user = User.friendly.find(params[:id])
  if @user.update(user_params)
   flash[:notice] = "You have successfully update your information"
   redirect_to "/"
 end
end

def destroy
 @user = User.friendly.find(params[:id])
 @user.destroy
end

private

def user_params
 params.require(:user).permit(:background, :username_or_email, :first_name,  :last_name, :email, :password, :password_confirmation, :user_name, :female, :male, :avatar, :gender, :zip_code, :birthdate)
end

如需了解更多信息,请随时提出。再次感谢您对我的错误的所有帮助和解释。

用户控制器

document.addEventListener('mousemove', function(e) {
    console.log(document.elementFromPoint(e.pageX, e.pageY)); 
})

1 个答案:

答案 0 :(得分:1)

您的方法有pungent code smell;我认为您的User模型没有任何理由拥有t.integer "user_id"列,尤其是当您直接在用户模型上设置资产时。这也是一种糟糕而脆弱的方法,因为您将图像与User混为一谈。

在构建此类功能时,尝试规范化您的域模型会很有用,一种方法是使用两个表 - usersuser_avatars。这样,user_avatars表可以使用user_id列作为外键。 User实例has_one :avatar_image, class_name: "::UserAvatar"UserAvatarbelong_to :user

这将允许您的user个实例(即user = User.new;我只是表明它是User klass的一个实例)才能够致电user.avatar_image;如果has_attached_file :avatar上有UserAvatar声明,您就可以通过user.avatar_image.avatar.url(:thumb)

获取该声明