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

When I update my Avatar picture, it changes all users picture

我的代码似乎出错了。我一直在查看我过去的两个项目,其中一个我有一张图片 table 将 picture_id 与用户相关联,但在另一个项目中甚至不需要它,我忘记了我是如何做到的做到了。我的代码中的任何改进建议和错误原因将不胜感激,在此先感谢您。

架构

create_table "users", force: true do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.string   "email"
    t.string   "password_digest"
    t.string   "user_name"
    t.date     "birthdate"
    t.integer  "zip_code"
    t.string   "gender"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "avatar_file_name"
    t.string   "avatar_content_type"
    t.integer  "avatar_file_size"
    t.datetime "avatar_updated_at"
    t.integer  "user_id"
    t.integer  "profile_id"
    t.string   "background_file_name"
    t.string   "background_content_type"
    t.integer  "background_file_size"
    t.datetime "background_updated_at"
    t.string   "slug"
  end

User/show

<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>

User/index

<% 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

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

混为一谈

构建这样的功能时,最好尝试规范化您的域模型,一种方法是使用两个 tables - usersuser_avatars。这样,user_avatars table 可以有一个 user_id 列用作外键。具有 has_one :avatar_image, class_name: "::UserAvatar"UserAvatarUser 实例将 belong_to :user.

这将允许您的 user 实例(即 user = User.new;我只是表明它是 User 类的一个实例)能够调用 user.avatar_image;如果您在 UserAvatar 上有一个 has_attached_file :avatar 声明,您将能够通过 user.avatar_image.avatar.url(:thumb)

获取它