未定义的方法`avatar&#39;对于#<user :: activerecord_relation:0x007fc328248ef0>

时间:2016-02-17 23:26:31

标签: ruby-on-rails ruby ruby-on-rails-4

我试图显示按其姓氏或名字搜索的用户的数据。我能够显示为用户返回的所有数据(例如,如果用户名按名字搜索,我可以提取与搜索到的用户相关的所有其他字段/数据,例如城市,州/省等)。

似乎给我一个错误的唯一字段是与每个用户关联的头像(个人资料照片)字段。 <%= 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

2 个答案:

答案 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指出的那样,拥有一个返回单个用户的索引方法是没有意义的。因此,您应该将此功能映射到另一个控制器方法。