0

私は現在、最初の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

config /routes

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
4

1 に答える 1

2

エラーに細心の注意を払ってください。最初は混乱する可能性があります。

undefined method 'name' for nil:NilClass

「user123:User」ではなく「for nil:NilClass」と表示されます。これは、#name メソッドを呼び出しているオブジェクトが、User オブジェクトではなく nil オブジェクトであることを意味します。このエラーは、@user インスタンス変数が設定されていないために発生するため、@user は実際のユーザーではなく nil です。したがって、params[:user_id] が適切に送信されていないと推測しています。

于 2012-09-29T16:14:07.763 に答える