【问题标题】:Passing parameter in URL and then rendering errors with 'new' action if validation not passed如果验证未通过,则在 URL 中传递参数,然后使用“新”操作呈现错误
【发布时间】:2012-10-15 12:01:56
【问题描述】:

我遇到了一些我怀疑并没有那么难解决的问题,只是我缺乏经验让我很难解决。

我有我的路线

match '(/:client_id)/signup',   to: 'users#new'

现在,如果客户端向 www.myappurl.com/123/signup 的任何人发送链接,用户将注册并且他的用户模型将接收 client_id 作为参数(我稍后需要)。

控制器:

def new
  @user = User.new
  if signed_in?
    redirect_to root_path
  end
end

def create
  @user = User.new(params[:user])

  if @user.save
    sign_in @user
    flash[:success] = t("users.new.welcome")
    redirect_to @user
  else
    render 'new' #and this is the problem
  end
end

问题是,当用户提交他的应用程序时,他提供的信息没有通过验证,然后呈现“新”操作,但我失去了这个 :client_id 参数,因此他和客户之间的关联。

我已经尝试了 redirect_to 并传递了参数。这可行,但不会显示错误消息。

任何想法如何解决它?

编辑

我在提交无效信息之前的调试:

controller: users
action: new
locale: en
client_id: '2'

之后:

!binary "dXRmOA==": ✓
!binary "YXV0aGVudGljaXR5X3Rva2Vu": ldtdjuWAWHB052qY3ASoH1Mv3XYtrdRcL56DgSaYC0Q=
!binary "dXNlcg==": !ruby/hash:ActiveSupport::HashWithIndifferentAccess
!binary "Zmlyc3RfbmFtZQ==": ''
!binary "bGFzdF9uYW1l": ''
!binary "ZW1haWw=": ''
!binary "Y2xpZW50X2lk": '2'
!binary "cGFzc3dvcmQ=": ''
!binary "cGFzc3dvcmRfY29uZmlybWF0aW9u": ''
!binary "Y29tbWl0": Create my account
action: create
controller: users
locale: en

服务器日志

Started POST "/en/users" for 127.0.0.1 at 2012-10-16 07:10:31 +0800
Processing by UsersController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"ldtdjuWAWHB052qY3ASoXYtrdRcL56DgSaYC0Q=", "user"=>{"first_name"=>"", "last_name"=>"", "email"=>"", "client_id"=>"2", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Create my account", "locale"=>"en"}
(0.4ms) BEGIN
User Exists (2.5ms)  SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER('') LIMIT 1
(0.1ms)  ROLLBACK
Rendered shared/_error_messages.html.erb (18.6ms)
Rendered users/_fields_for_registration_no_verification.html.erb (36.9ms)
Rendered users/_password_fields.html.erb (3.6ms)
Rendered users/new.html.erb within layouts/application (77.5ms)
Rendered layouts/_shim.html.erb (0.0ms)
Rendered layouts/_google_tracking_code (0.0ms)
User Load (2.4ms)  SELECT "users".* FROM "users" WHERE "users"."remember_token" IS NULL  LIMIT 1
Rendered layouts/_header.html.erb (8.7ms)
Rendered layouts/_footer.html.erb (1.5ms)
Completed 200 OK in 437ms (Views: 213.4ms | ActiveRecord: 14.9ms)

编辑

我找到了问题的真正根源(与下面的答案不同)。问题是当我在表单中使用隐藏字段时,我使用的是以下代码:

<%= f.hidden_field :client_id, { :value => params[:client_id]} %>

事实证明,一旦我删除了{ :value =&gt; params[:client_id]} 部分,在注册失败后一切都开始按预期工作。永远感谢您的帮助。

【问题讨论】:

  • 如果有人问,我会在 form_for 的隐藏字段中传递 client_id

标签: ruby-on-rails parameters routing render


【解决方案1】:

这是因为当验证失败并呈现 new 时,您的 :cliend_id 会从 @user 对象中丢失。

def new
  if params[:client_id]
    @user = User.new(:client_id => params[:client_id])
  else
    @user = User.new
  end 
  if signed_in?
    redirect_to root_path
  end
end

并且在您的 users/new.html.haml 视图中确保您有 :client_id 的隐藏字段。

=form_for @user do |u|
  =f.hidden_field :client_id  #This will prevent your client_id from getting lost when validation fails.

更简洁的方法是将 before_filter 用于您的新操作。希望你能明白。

【讨论】:

  • 感谢您的回复,不幸的是,如果我尝试您的解决方案,client_id 仍然丢失
  • 你可以在第一次使用:client_id 来粘贴你的服务器日志吗?
  • 我刚刚写了一个小应用程序,它在注册期间存储了client_id。请查看github.com/deepakprasanna/signup
  • 感谢伙伴,感谢您的努力。您的应用无法处理不成功的用户创建,因此无法复制问题。用户控制器 -> 创建操作 -> 没有“其他” :(
  • 创建用户不成功是什么意思?创建新用户时验证失败?
猜你喜欢
  • 2017-03-13
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 2013-07-10
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
相关资源
最近更新 更多