Ruby on rails 未定义的方法`avatar';对于#<;用户::ActiveRecord \-关系:0x007fc328248ef0>;

Ruby on rails 未定义的方法`avatar';对于#<;用户::ActiveRecord \-关系:0x007fc328248ef0>;,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我正在尝试显示按用户名或姓氏搜索的用户的数据。我能够显示为用户返回的所有数据(例如,如果按名字搜索用户,我可以提取与搜索用户相关的所有其他字段/数据,如城市、州/省等) 唯一似乎给我一个错误的字段是与每个用户相关联的化身(个人资料照片)字段 注意:我可以从其他用户页面(例如show.html.erb)显示此字段 我在点击搜索结果页面时遇到的错误是: 用户索引中的命名错误-未定义的方法“化身”# 用户::ActiveRecord\u关系:0x007fc328248ef0 \u user.html.

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

唯一似乎给我一个错误的字段是与每个用户相关联的化身(个人资料照片)字段<代码>

注意:我可以从其他用户页面(例如show.html.erb)显示此字段

我在点击搜索结果页面时遇到的错误是:

用户索引中的命名错误-未定义的方法“化身”# 用户::ActiveRecord\u关系:0x007fc328248ef0

\u 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>
<% if @user.present? %>
  <%= render @user %>
<% else %>
  <p>There are no posts containing the term(s) <%= params[:search] %>.</p>
<% end %>
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


,
index.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>
<% if @user.present? %>
  <%= render @user %>
<% else %>
  <p>There are no posts containing the term(s) <%= params[:search] %>.</p>
<% end %>
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.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
class用户6..20,:on=>:create
验证:密码确认,状态:true,如果:->{new_record?| | changes[“password”]}
已经附上了文件:阿凡达,
:path=>“:rails\u root/public/system/:attachment/:id/:basename\u:style.:extension”,
:url=>“/system/:attachment/:id/:basename\ux:style.:extension”,
:样式=>{
: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=>'-设置颜色空间sRGB-条带',
:large=>'-set colorspace sRGB-strip',
:retina=>'-设置颜色空间sRGB-条带-锐化0x0.5'
}
验证_附件:头像,
:presence=>true,
:size=>{:in=>0..10.MB},
:content_type=>{:content_type=>/^image\/(jpeg | png | gif | tiff)$/}
终止
用户\u控制器.rb

<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>
<% if @user.present? %>
  <%= render @user %>
<% else %>
  <p>There are no posts containing the term(s) <%= params[:search] %>.</p>
<% end %>
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
class UsersController
您看到此错误是因为您在
关系
对象上调用方法,而不是在
用户
对象上调用方法。尝试调用。首先在关系对象上,它将返回一个
User
对象。然后,您可以在该
用户
对象上调用
.avatar

看起来您正在将关系存储到
users\u controller.rb的
index
方法中的
@user

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(条件:)。首先
获取实际的单一用户对象并将其保存到@User然而,正如max指出的,使用返回单个用户的索引方法是没有意义的。因此,您应该将此功能映射到另一个控制器方法

您看到此错误是因为您在
关系
对象上调用方法,而不是在
用户
对象上调用方法。尝试调用。首先在关系对象上,它将返回一个
User
对象。然后,您可以在该
用户
对象上调用
.avatar

看起来您正在将关系存储到
users\u controller.rb的
index
方法中的
@user

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(条件:)。首先
获取实际的单一用户对象并将其保存到@User然而,正如max指出的,使用返回单个用户的索引方法是没有意义的。因此,您应该将此功能映射到另一个控制器方法

您正在尝试将用户集合用作单个用户

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

这里的区别在于,
user
是一个局部变量,rails在渲染局部对象时会创建该变量。而
@user
是您的命名收藏

所以只需使用局部变量:

<%= image_tag user.avatar.url(:thumb) %>


命名变量时要注意多重化。

您试图将一组用户用作单个用户

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

这里的区别在于,
user
是一个局部变量,rails在渲染局部对象时会创建该变量。而
@user
是您的命名收藏

所以只需使用局部变量:

<%= image_tag user.avatar.url(:thumb) %>


命名变量时要注意复数。

User.all将返回一个集合,因此更适合命名为@users。您正在尝试调用集合上的实例方法。您需要迭代集合并在单个实例上调用avatar.User.all将返回一个集合,因此更合适