“形式中的第一个参数不能包含nil或为空”错误

时间:2014-02-25 16:33:26

标签: ruby-on-rails ruby ruby-on-rails-3

我正在创建一个注册表单,这是我的视图文件

<%= form_for @user do |f| %>
<fieldset>
<legend>Registration</legend>
    <div class="reg_form">  
    <label for="first_name">First Name</label>
        <%= f.text_field :first_name %>
    </div>
    <div class="reg_form">  
    <label for="last_name">Last Name</label>
        <%= f.text_field :last_name %>
    </div>
    <div class="reg_form">
    <label for="email">Email</label>
        <%= f.text_field :email %>
    </div>
    <div class="reg_form">
    <label for="password">Password</label>
        <%= f.password_field :password %>
    </div>
    <div class="submit">
        <%= f.submit%>
    </div>
</fieldset>
<% end %>
<hr>
User list <br />
<%= if!@users.blank? %>
<% for item in @users %> <br />
<%= item.first_name %> <br />
<%= item.last_name %> <br />
<%= item.email %> <br />
<%= item.password %> <br />
<% end %>

,控制器如下

class UserController < ApplicationController

layout "register"

def new
@user = User.new
@users = User.find(:all)
end

def create
@user = User.new(params[:user])
if @user.save
redirect_to new_user_path
end
end

end

和模型文件

class User < ActiveRecord::Base

end

当我尝试在服务器上运行时,我收到错误 表单中的第一个参数不能包含nil或为空 在第1行

任何帮助表示赞赏!谢谢

2 个答案:

答案 0 :(得分:1)

new操作更新为

def user        ### As your routes refer to user action and not new
 @user = User.new
 @users = User.find(:all) ### Note variable name is different
end

您可以使用@users实例变量来显示用户列表。

@user会引用您尝试创建的新用户,并将其作为参数传递给form_for

您的代码中的第一个问题是,您在两个案例中使用相同的实例变量@user(它们应该不同),这导致@user被设置为{{返回的值1}}。 看一下这个错误,我猜你现在没有任何数据库用户,所以 User.find(:all)已返回User.find(:all)。 在nil中,您传递form_for并收到错误。

另外,从@user模型中移除newcreate

修改

您的路线配置不同。您有一条User行,UsersController#user行动正在呈现视图而不是user。在这种情况下,您应该将new操作重命名为new,因为当前未调用user操作。

我建议您使用7个具体操作去找new控制器。请参阅Rails Routing以获得更好的主意。

答案 1 :(得分:1)

您正在呈现UsersController#user操作,该操作在您的控制器中没有定义。

为了正确呈现该操作,您需要将其添加到控制器

def user
  @user = User.new
  @users = User.find(:all)
end

您可能应该使用其中一种常规操作(新建,编辑等),但如果您确定您希望路线为/user/user,那么您需要设置相应的操作up控制器中的实例变量。