我正在创建一个注册表单,这是我的视图文件
<%= 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行
任何帮助表示赞赏!谢谢
答案 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
模型中移除new
和create
。
修改强>
您的路线配置不同。您有一条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控制器中的实例变量。