2

データベース内のユーザーと一緒にチェックボックスを動的に作成したいのですが、これを選択することができます (1 つまたは複数)。ただし、以下のコードで次のエラーが発生するため、明らかに何か間違っていると思われます。

undefined method `each' for nil:NilClass
...
<% @users.each do |user| %> <--- the line with the error

コントローラー:

class ProjectsController < ApplicationController
    ...

    def new
      @project = Project.new
      @users = (current_user.blank? ? User.all : User.find(:all, :conditions => ["id != ?", current_user.id]))
    end

    ...
end

ビュー (new.html.erb):

<%= form_for @project do |f| %>
    <div class="alert alert-block">  
        <%= f.error_messages %>
    </div>
    <div class="text_field">
        <%= f.label :title%>
        <%= f.text_field :title%>
    </div>
    <div class="text_field">
        <%= f.label :description%>
        <%= f.text_field :description%>
    </div>
    <div class="dropdown">
        <%= f.label :start_date%>
        <%= f.date_select :start_date %>
    </div>
    <div class="dropdown">
        <%= f.label :end_date%>
        <%= f.date_select :end_date %>
    </div>
    <% @users.each do |user| %>
        <%= check_box_tag "project[member_ids][]", user.id, @project.member_ids.include?(user.id), :id => "user_#{user.id}" %> 
        <%= label_tag "user_#{user.id}", user.first_name %>
    <% end %>
    <div class="checkbox">
</div>
    <div class="submit">
        <%= f.submit "Spara" %>
    </div>
<% end %>

モデル:

class Project < ActiveRecord::Base
  has_and_belongs_to_many :users
  belongs_to :user
  has_many :tickets, :dependent => :destroy

  ... validations ...

  attr_accessible :user_id, :title, :description, :start_date, :end_date
end

私のデータベースには 5 人のユーザーがいるので、テーブルは空でも何でもありません。ここで何が間違っていますか?

4

1 に答える 1

7

フォームを送信しようとして検証に失敗すると、エラーが発生します。create アクションがnewテンプレートをレンダリングする場合、そこに問題があります。

コメンターの1人が示唆しているよう@usersに、作成アクションで宣言できます。ただし、次のコードのように、検証に失敗した場合にのみ宣言することをお勧めします (db クエリの数を 1 つ減らし、不要なアクティブ レコード オブジェクトの作成を減らすため)。

def create
  @project = Project.new params[:project]

  if @project.save
    redirect_to @project
  else
    @users = User.all # only declare this here when it is actually needed
    render :new
  end
end
于 2013-02-10T13:06:16.410 に答える