0

(もともとこの投稿の一部だった 2 番目の質問を別の投稿に分割しました)

Rails を使用して製品のランディング ページを作成しています。このページでは、ユーザーが電子メール アドレスを入力して、製品の発売時に通知を受け取ることができます。(はい、私のためにこれを行うことができるサービス/宝石などがありますが、私はプログラミングが初めてで、Rails を学ぶために自分で構築したいと考えています。)

フォームの送信時にエラーが発生した場合、アプリは現在「/invites」にリダイレクトします。代わりに、元のフォームと同じページ/URL にエラー メッセージを表示したいですか? (私の場合、エラーメッセージが「/invites」に表示されている間、フォームはルートにあります)

ルートに関するRailsガイドと、フォームエラーの処理に関する多数のstackoverflowの投稿を読みましたが、私が持っている質問に答えているようには見えません。

更新: @rovermicroverからの返信に基づいて明確にしたいと思います。私は Ajax ソリューションを受け入れていますが、エラー メッセージを表示するページの更新で問題ありません。(@rovermicrover による推奨事項を希望どおりに機能させることができませんでした。詳細については、以下のその解決策に対する私の回答を参照してください。)

私がしたこと:

招待モデル:

    class Invite < ActiveRecord::Base
      attr_accessible :email

      validates :email, :presence => {:message => "Please enter an email address."}

    end

私のルートファイル:

SuggestionBoxApp::Application.routes.draw do
  root to: 'invites#new'
  resources :invites
end

これは私が Invites コントローラーに持っているものです (参照しているアクションのみを含めました: new、create、show - 基本的には Rails が生成する可能性のあるもののデフォルトです):

class InvitesController < ApplicationController

      def show
      @invite = Invite.find(params[:id])

        respond_to do |format|
          format.html # show.html.erb
          format.json { render json: @invite }
        end
      end

      def new
        @invite = Invite.new

        respond_to do |format|
          format.html # new.html.erb
          format.json { render json: @invite }
        end
      end

      def create
        @invite = Invite.new(params[:invite])

        respond_to do |format|
          if @invite.save
            format.html { redirect_to @invite }
            format.json { render json: @invite, status: :created, location: @invite }
          else
            format.html { render action: "new" }
            format.json { render json: @invite.errors, status: :unprocessable_entity }
          end
        end
      end
    end

この質問への回答に役立つ追加情報があればお知らせください。ありがとう!

4

2 に答える 2

0

純粋な Ruby on Rails の観点から、フォームを「リモート」で送信するという手段に訴えることなく、これを行う方法があります。ただし、ブラウザで Cookie が有効になっている場合にのみ、これを行うことができます。

エラーが発生した場合に備えて、フォームデータをセッション情報に保存するという考え方です。成功した場合は、セッション データを削除することを忘れないでください。

  def new
    @invite = Invite.new(session[:invite])

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @invite }
    end
  end

  def create
    @invite = Invite.new(params[:invite])

    respond_to do |format|
      if @invite.save
        session.delete(:invite)
        format.html { redirect_to @invite }
        format.json { render json: @invite, status: :created, location: @invite }
      else
        session[:invite] = params[:invite]
        format.html { render action: "new" }
        format.json { render json: @invite.errors, status: :unprocessable_entity }
      end
    end
  end
于 2013-07-18T05:18:37.057 に答える