2

私は Rails を初めて使用し、別のチームによって作成されたアプリを変更しようとしています。検証に失敗した後、フォーム フィールドを保持する必要があるという一般的な問題があります。このアプリでは、ユーザーは名前、電子メール、招待コードなどの基本情報を送信します。コントローラーで招待コードを検証します。失敗した場合、現在はredirect_to :back実行されますが、ユーザーが入力した情報が失われ、フォームがクリアされます。私が調査した他のページから、適切なことはrender :action => :new. ただし、それを試みるとエラーが発生します。

この試み…

format.html { render :action => "new" }

すべて同じ結果になります...

テンプレートがありません

テンプレート after_step/new、application/new がありません...

以前の開発者が設定した方法では、フォームのステップ 1 は「users/registrations/new」にありますが、次のステップは「after_step/step_two」にあるなどです。したがって、フォームを送信すると、「after_step_controller」になります。 .rb" で検証を行っています。明らかに、「registrations_controller.rb」ではなく、そのコントローラーで「新しい」アクションをレンダリングしようとしていることがわかります。

しかし、私がそれを強制しようとすると...

format.html { render :template => "registrations_controller/new" }        
format.html { render :action => "new", :controller => "registrations" }

...まだテンプレートが見つからないというエラーが表示されます。したがって、オンラインで提案されている他のことを試しました...

format.html { render :template => "users/registrations/new" }
format.html { render :file => "users/registrations/new.html.erb" }

次のエラーが発生したため、これらも機能しませんでした。

NilClass:Class の未定義メソッド `model_name'

その後、これを調査したところ、「新しい」関数は新しいユーザーを作成していないという意見がほとんどでした。ただし、コードはそこにあるため、何が起こっているのかわかりません。

誰でもこれで正しい方向に向けることができますか? 明らかにショーストッパーではありませんが、ユーザーエクスペリエンスを向上させるために、検証に失敗したときにフォームフィールドの値を保持したいと思います。

ここにいくつかの情報があります...

ユーザー/登録/new.html.erb

<%= form_for(@user, :url => step_two_path) do |f| %>
        <div class="signup_step_mid_content">
          <div class="step_content_block">
            <h3> First, tell us a little bit about yourself:</h3>
            <div class="signup_filed_small mrgn_r_20">
              <label>First Name</label>
              <%= f.text_field :first_name, :title => "First Name", :placeholder => "First Name" %>
            </div>

registrations_controller.rb

def new
    @user = User.new
    @invite_code = params[:invite_code]
end

after_step_controller.rb

def step_two
    @user = User.find_by_email(params[:user][:email])
    respond_to do |format|

      @tester = Prefinery::Tester.new(:beta_id => 1234) 
      @tester.email = params[:user][:email]
      @tester.invitation_code = params[:user][:invitation_code]
      @tester.status = 'active' 

      if !@tester.save 
        #format.html{redirect_to :back }

        #format.html { render :template => "registrations_controller/new" }        
        #format.html { render :action => "new", :controller => "registrations" }
        #format.html { render :action => "new" }

        #format.html { render :template => "users/registrations/new" }
        #format.html { render :file => "users/registrations/new.html.erb" }

さらに情報が必要な場合はお知らせください。

4

5 に答える 5

4

あなたはこのステップについて正しいです:

format.html { render :template => "users/registrations/new" }

問題は、「after_step_controller」で @user のインスタンスを設定していないことです。レンダリングを実行する場合は、@user のインスタンスを設定する必要があります。これには、フォームに表示されるので、検証エラーを表示できます。

それが役に立てば幸い!

于 2012-07-16T14:32:28.087 に答える
2

うーん。ここにいくつかの提案があります:

format.html { render :template => "users/registrations/new" }

あるいは単に

format.html { render "users/registrations/new" }

進むべき道のようです。ただし、物事をクリーンアップし、プロセスの特定のコントローラーにすべてを移動することを検討します。

  • @user インスタンス変数を次のように初期化する必要があります

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

(おそらく)次のフォームのユーザーがフォームによって送信されたパラメーターを保持するようにします。

于 2012-07-16T14:39:40.457 に答える
2
render :new

あなたのために仕事をします

于 2016-09-21T17:27:21.330 に答える
1

私は、あなたが得ると思います

undefined method `model_name' for NilClass:Class

newテンプレートは変数を使用しています@userが、step_twoメソッドはそれを定義していないため、例外です。

于 2012-07-16T14:29:02.460 に答える