【问题标题】:When I update my Avatar picture, it changes all users picture当我更新我的头像图片时,它会更改所有用户的图片
【发布时间】:2015-11-13 00:44:44
【问题描述】:

我的代码似乎出错了。我一直在查看我过去的两个项目,在一个项目中,我有一个图片表来将 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

用户/节目

<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

【问题讨论】:

  • 也许您也应该从控制器中复制一些代码?
  • @Liyali 我也添加了我的用户控制器。

标签: ruby-on-rails ruby avatar


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的解释。我将重新格式化我的表格的外观,以期避免将来出现更大的问题。第一次听说“代码气味”。谢谢你,我有最后一个问题。我是否还应该制作诸如 user_profiles 之类的模型以便将用户个人资料信息放在那里或将其与用户模型一起保存?再次感谢您的解释。
  • 很有可能,用户将拥有一个个人资料(但可能有多个头像图像?取决于您的用例)和一个头像,这可能是他们个人资料的一部分。用户has_one 的好案例:profile。将这些与用户本身分开并没有什么坏处。
猜你喜欢
  • 1970-01-01
  • 2021-11-14
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 2022-07-06
  • 2021-06-14
  • 1970-01-01
相关资源
最近更新 更多