设计 - 错误消息未显示 - 重定向到更新而不是创建

时间:2011-07-20 21:02:52

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

我已经完成了注册控制器的编写,我正在尝试返回表单来创建用户,但它只能部分工作。

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"}

那么为什么发送帖子会被定向到更新?我该如何解决这个问题?

更新:好的,所以它被重定向到更新(我相信),因为资源被定义为现有对象。但是因为我有自己的设计策略说这个特定的用户没有经过身份验证,所以它无法进行更新(需要身份验证)并重定向到新的,但没有参数。

所以问题就变成了,如何设置资源使它看起来像一个新用户,但在创建新用户之前有错误。

例如,错误可能是“密码不匹配”,但如果您在新用户上发现错误,则会显示“已发送电子邮件”。

2 个答案:

答案 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
...