我似乎在我的代码中出错了。我一直在看我过去的两个项目,其中一个我有一个图片表来将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>
<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
如需了解更多信息,请随时提出。再次感谢您对我的错误的所有帮助和解释。
用户控制器
document.addEventListener('mousemove', function(e) {
console.log(document.elementFromPoint(e.pageX, e.pageY));
})
答案 0 :(得分:1)
您的方法有pungent code smell;我认为您的User
模型没有任何理由拥有t.integer "user_id"
列,尤其是当您直接在用户模型上设置资产时。这也是一种糟糕而脆弱的方法,因为您将图像与User
混为一谈。
在构建此类功能时,尝试规范化您的域模型会很有用,一种方法是使用两个表 - users
和user_avatars
。这样,user_avatars
表可以使用user_id
列作为外键。 User
实例has_one :avatar_image, class_name: "::UserAvatar"
和UserAvatar
将belong_to :user
。
这将允许您的user
个实例(即user = User.new
;我只是表明它是User
klass的一个实例)才能够致电user.avatar_image
;如果has_attached_file :avatar
上有UserAvatar
声明,您就可以通过user.avatar_image.avatar.url(:thumb)