我已经完成了注册控制器的编写,我正在尝试返回表单来创建用户,但它只能部分工作。
def create
u = User.find_by_email(params[:user][:email])
...
if u && u.unregistered
self.resource = u
if resource.update_with_password(params[resource_name])
...
set_flash_message :notice, :updated if is_navigational_format?
...
sign_in(resource_name, resource)
if u.confirmed?
redirect_to consultations_path
else
redirect_to send_advisor_confirmation_path(u.id)
end
else
clean_up_passwords(resource)
# this is the place that has a problem
respond_with_navigational(resource) { render_with_scope :new }
end
return
end
super
end
(旁注:在我的应用程序中,可以创建尚未登录的用户,他们被定义为“未注册”,并且他们可以通过注册过程来声明他们的帐户。)< / p>
这个respond_with_navigational第一次工作(当new
发布到create
时),但是当你再次搞砸了表格时,它会清除整个表格(当create
发布到create
......或应该是)。日志说它是第一次创建,但第二次它将更新:
Started POST "/users" for 127.0.0.1 at 2011-07-20 15:49:30 -0500
Processing by RegistrationsController#create as HTML
...
Started POST "/users" for 127.0.0.1 at 2011-07-20 15:50:56 -0500
Processing by RegistrationsController#update as HTML
根据路线(耙路线):
POST /users(.:format) {:action=>"create", :controller=>"users"}
new_user GET /users/new(.:format) {:action=>"new", :controller=>"users"}
edit_user GET /users/:id/edit(.:format) {:action=>"edit", :controller=>"users"}
user GET /users/:id(.:format) {:action=>"show", :controller=>"users"}
PUT /users/:id(.:format) {:action=>"update", :controller=>"users"}
那么为什么发送帖子会被定向到更新?我该如何解决这个问题?
更新:好的,所以它被重定向到更新(我相信),因为资源被定义为现有对象。但是因为我有自己的设计策略说这个特定的用户没有经过身份验证,所以它无法进行更新(需要身份验证)并重定向到新的,但没有参数。
所以问题就变成了,如何设置资源使它看起来像一个新用户,但在创建新用户之前有错误。
例如,错误可能是“密码不匹配”,但如果您在新用户上发现错误,则会显示“已发送电子邮件”。
答案 0 :(得分:4)
编辑1: 我错过了你的一些问题,这可能没什么帮助。
确保您使用此类内容在您的网页上显示:
layouts / application.html.erb(或您需要的任何地方)
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
答案 1 :(得分:0)
我不喜欢这个,但它确实有效。如果有人有更好的方法,请告诉我。谢谢。
...
else
resource.unregistered_advisor = true
clean_up_passwords(resource)
a = User.new(:email => resource.email, :name => resource.name, :confirmation_token => resource.confirmation_token)
resource.errors.each do |key,value|
a.errors[key] = value
end
self.resource = a
respond_with_navigational(resource) { render_with_scope :new }
end
...