【发布时间】:2016-02-17 23:26:31
【问题描述】:
我正在尝试显示按名字或姓氏搜索的用户的数据。我能够显示为用户返回的所有数据(例如,如果按名字搜索用户,我可以提取与搜索用户关联的所有其他字段/数据,例如城市、州/省等)。
似乎给我错误的唯一字段是与每个用户关联的头像(个人资料照片)字段。 <%= image_tag @user.avatar.url(:thumb) %>
注意:我可以从其他用户页面(例如 show.html.erb)显示此字段。
我在点击搜索结果页面时遇到的错误是:
Users#index 中的 NoMethodError - 未定义的方法 `avatar' 用于# 用户::ActiveRecord_Relation:0x007fc328248ef0
_user.html.erb
<div class="card">
<div class="columns">
<div class="col">
<%= image_tag @user.avatar.url(:thumb) %>
</div>
<div class="col">
<div class="name">
<%= user.firstname %> <%= user.lastname%>
</div>
<br>
<b><%= user.city%>, <%= user.stateprov%></b>
</div>
</div>
</div>
index.html.erb
<% if @user.present? %>
<%= render @user %>
<% else %>
<p>There are no posts containing the term(s) <%= params[:search] %>.</p>
<% end %>
user.rb
class User < ActiveRecord::Base
def self.search(search)
where("firstname LIKE ? OR lastname LIKE ?", "%#{search}%", "%#{search}%")
end
has_secure_password
validates_length_of :password, :in => 6..20, :on => :create
validates :password_confirmation, presence: true, if: -> { new_record? || changes["password"] }
has_attached_file :avatar,
:path => ":rails_root/public/system/:attachment/:id/:basename_:style.:extension",
:url => "/system/:attachment/:id/:basename_:style.:extension",
:styles => {
:thumb => ['175x175#', :jpg, :quality => 100],
:preview => ['480x480#', :jpg, :quality => 70],
:large => ['600>', :jpg, :quality => 70],
:retina => ['1200>', :jpg, :quality => 30]
},
:convert_options => {
:thumb => '-set colorspace sRGB -strip',
:preview => '-set colorspace sRGB -strip',
:large => '-set colorspace sRGB -strip',
:retina => '-set colorspace sRGB -strip -sharpen 0x0.5'
}
validates_attachment :avatar,
:presence => true,
:size => { :in => 0..10.megabytes },
:content_type => { :content_type => /^image\/(jpeg|png|gif|tiff)$/ }
end
users_controller.rb
class UsersController < ApplicationController
def create
@user = User.new(user_params)
if @user.save
flash[:success] = "You signed up successfully"
flash[:color] = "valid"
redirect_to @user
else
flash[:notice] = "Form is invalid"
flash[:color] = "invalid"
render "new"
end
end
def index
@user = User.all
if params[:search]
@user = User.search(params[:search]).order("created_at DESC")
else
@user = User.all.order('created_at DESC')
end
end
def show
@user = User.find(params[:id])
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
redirect_to @user
else
render 'edit'
end
end
private
def user_params
params.require(:user).permit(:firstname, :lastname, :email, :aptno, :streetaddress, :city, :country, :stateprov, :poszip, :receive_newsletters, :terms_accepted, :password, :password_confirmation, :avatar)
end
end
【问题讨论】:
-
User.all 将返回一个集合,因此将其命名为@users 更合适。您正在尝试在集合上调用实例方法。您需要遍历集合并在单个实例上调用 avatar。
标签: ruby-on-rails ruby ruby-on-rails-4