我试图显示按其姓氏或名字搜索的用户的数据。我能够显示为用户返回的所有数据(例如,如果用户名按名字搜索,我可以提取与搜索到的用户相关的所有其他字段/数据,例如城市,州/省等)。
似乎给我一个错误的唯一字段是与每个用户关联的头像(个人资料照片)字段。 <%= image_tag @user.avatar.url(:thumb) %>
注意:我可以从其他用户页面显示此字段(例如show.html.erb)。
点击搜索结果页面时出现的错误是:
用户中的NoMethodError #index - 未定义的方法`avatar&#39;为# 用户:: 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
答案 0 :(得分:4)
您正在尝试将一组用户用作单个用户。
def index
@users = User.all
if params[:search]
@users = User.search(params[:search]).order("created_at DESC")
else
@users = User.all.order('created_at DESC')
end
end
<% if @users.any? %>
<%= render @users %>
<% else %>
<p>There are no posts containing the term(s) <%= params[:search] %>.</p>
<% end %>
到目前为止,这些变化只是为了避免开发人员混淆。然而,真正的症结在于您使用@user
而非user
的部分内容。
<%= image_tag @user.avatar.url(:thumb) %>
这里的区别在于user
是rails渲染部分时创建的局部变量。虽然@user
是您错过的收藏品!
所以只需使用局部变量:
<%= image_tag user.avatar.url(:thumb) %>
在命名变量时要注意多元化。
答案 1 :(得分:1)
您看到此错误是因为您在Relation
对象上调用方法,而不是在User
对象上调用方法。尝试在关系对象上调用.first,它将返回一个User
对象。然后,您可以在该.avatar
个对象上调用User
。
您的@user
index
方法users_controller.rb
中的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
似乎存储了关系
.all
在这两种情况下,您都在调用User.where(criteria: <unique criteria>).first
,这将返回一个关系。您可以使用BookingDetailViewController
的llines中的某些内容来获取实际的单个用户对象并将其保存到@user。 然而,正如max指出的那样,拥有一个返回单个用户的索引方法是没有意义的。因此,您应该将此功能映射到另一个控制器方法。