当我更新我的头像图片时,它会更改所有用户图片
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>
<b class="size">|</b>
<a href="">Settings</a>
<b class="size">|</b>
</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 - users
和 user_avatars
。这样,user_avatars
table 可以有一个 user_id
列用作外键。具有 has_one :avatar_image, class_name: "::UserAvatar"
和 UserAvatar
的 User
实例将 belong_to :user
.
这将允许您的 user
实例(即 user = User.new
;我只是表明它是 User
类的一个实例)能够调用 user.avatar_image
;如果您在 UserAvatar
上有一个 has_attached_file :avatar
声明,您将能够通过 user.avatar_image.avatar.url(:thumb)
获取它
我的代码似乎出错了。我一直在查看我过去的两个项目,其中一个我有一张图片 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>
<b class="size">|</b>
<a href="">Settings</a>
<b class="size">|</b>
</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 - users
和 user_avatars
。这样,user_avatars
table 可以有一个 user_id
列用作外键。具有 has_one :avatar_image, class_name: "::UserAvatar"
和 UserAvatar
的 User
实例将 belong_to :user
.
这将允许您的 user
实例(即 user = User.new
;我只是表明它是 User
类的一个实例)能够调用 user.avatar_image
;如果您在 UserAvatar
上有一个 has_attached_file :avatar
声明,您将能够通过 user.avatar_image.avatar.url(:thumb)