0

私は、修正するのがそれほど難しくないと思う問題に遭遇しました、そして単に私の経験の欠如がそれを難し​​くしています。

私は私のルートを持っています

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 => params[:client_id]}登録に失敗した後、すべてが期待どおりに機能し始めたことがわかりました。助けてくれてありがとう。

4

1 に答える 1

2

これは、検証が失敗して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を使用することです。あなたがアイデアを得ることを願っています。

于 2012-10-15T12:31:52.750 に答える