nil的未定义方法`users':NilClass

时间:2011-08-20 11:18:36

标签: ruby-on-rails-3

我正在尝试创建一个具有域和用户的应用程序,有3种类型的用户,超级管理员,域管理员和域用户。所有用户(3种类型)都在域表和域表中的域中。目前有域名和超级管理员。超级管理员可以登录并创建域和域用户。域用户应该与特定域相关(我的'users'表中有一个“domain_id”列)。现在,当我尝试在域下创建用户时(选择域后),我收到此错误“未定义的方法`用户'为nil:NilClass”。

我的用户控制器。

def new
    @domain = Domain.find(params[:id])
    @user = User.new
    @title = "Sign up"
end

def create
    @user = @domain.users.build(params[:user])
    if @user.save
       flash[:success] = "Welcome to My Space!"
       redirect_to @user
    else
       @title = "Sign up"
       render 'new'
    end
end

我的用户模型有。
    belongs_to:域
    验证:domain_id,:presence =>真正

和领域模型有     has_many:用户

我的new.html.erb表单

<%= form_for @user do |f| %>
  <%= f.label :first_name %>
  <%= f.text_field(:first_name, :size => 20) %>

  <%= f.label :last_name %>
  <%= f.text_field(:last_name, :size => 20) %>

  <%= f.label :email %>
  <%= f.text_field(:email, :size => 20) %>

  <%= f.label :password %>
  <%= f.password_field(:password, :size => 20) %>  

  <%= f.label :password_confirmation, "Verify Password" %>
  <%= f.password_field(:password_confirmation, :size => 20) %>

  <%= f.submit "Create" %>

<% end %>

1 个答案:

答案 0 :(得分:1)

假设@domain = Domain.find(params[:id])方法中的new做了它应该做的事情:

def new
  @domain = Domain.find(params[:id])
  @user = @domain.users.build
  @title = "Sign up"
end

def create
  @user = User.new(params[:user])
  if @user.save
    flash[:success] = "Welcome to My Space!"
    redirect_to @user
  else
    @title = "Sign up"
    render 'new'
  end
end

您的观点应如下所示:

<%= form_for @user do |f| %>
  <%= f.hidden_field :domain_id %>

  <%= f.label :first_name %>
  <%= f.text_field(:first_name, :size => 20) %>

  <%= f.label :last_name %>
  <%= f.text_field(:last_name, :size => 20) %>

  <%= f.label :email %>
  <%= f.text_field(:email, :size => 20) %>

  <%= f.label :password %>
  <%= f.password_field(:password, :size => 20) %>  

  <%= f.label :password_confirmation, "Verify Password" %>
  <%= f.password_field(:password_confirmation, :size => 20) %>

  <%= f.submit "Create" %>
<% end %>

由于表单中隐藏了domain_id字段,系统会将用户分配到正确的域。