我正在开发我的第一个rails项目。我正在尝试制作一个用于与朋友上传图片的网络应用程序。因此,在创建相册的表单上,他们应该有一个选择字段,供他们想要与之分享相册的朋友。但是,我在选择字段中显示名称时遇到问题,并且收到错误
undefined method 'name' for nil:NilClass
即使我的用户数据库中包含“name”列。我误解了“名字”的来源吗?我认为@users.name
之类的属性意味着进入数据库并找到每个用户的名称值?这是我的文件(如果您需要任何其他文件,请告诉我):
_form.html.erb(有错误的那个)
<%= form_for([@user, @album], :remote => true, :html => { :id => "uploadform", :multipart => true }) do |f| %>
<div>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :description %>
<%= f.text_area :description %>
<%= f.select :user, @users.name %>
<%=f.label :avatar, "Upload" %>
<%=f.file_field :avatar %>
<br>
<%=f.submit %>
</div>
<% end %>
专辑模型
class Album < ActiveRecord::Base
attr_accessible :avatar, :name
has_and_belongs_to_many :users
mount_uploader :avatar, AvatarUploader
end
用户模型
class User < ActiveRecord::Base
has_secure_password
attr_accessible :email, :name, :password, :password_confirmation
validates_presence_of :password, :on => :create
validates_format_of :name, :with => /[A-Za-z]+/, :on => :create
validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create
validates_length_of :password, :minimum => 5, :on => :create
has_many :albums
accepts_nested_attributes_for :albums
end
配置/路由
Pholder::Application.routes.draw do
resources :users do
resources :albums
end
resources :albums do
resources :pictures
end
专辑控制器
class AlbumsController < ApplicationController
def index
@albums = Albums.all
respond_to do |format|
format.html
format.json { render json: @albums }
end
end
def show
end
def update
end
def edit
end
def create
@users = Users.all
@user = User.find(params[:user_id])
@album = @user.albums.build(params[:album])
if @album.save
flash[:success] = "Album created!"
end
end
def new
@user = User.find(params[:user_id])
@album = Album.new
end
def destroy
end
end
答案 0 :(得分:2)
密切注意错误,最初可能会引起混淆:
undefined method 'name' for nil:NilClass
它表示“for nil:NilClass”而不是“user123:User”这意味着您调用#name方法的对象是一个nil对象而不是User对象。该错误是由于未设置@user实例变量,因此@user是nil而不是实际用户。所以我猜测params [:user_id]没有被正确发送。