0

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

フォームが正常に送信されたら、カスタムの「/thanks」ページにリダイレクトして、ユーザーが製品に関心を持ってくれたことに感謝したいと思います (また、簡単なアンケートに回答するように促します)。

現在、成功した送信は「/invites/:id/」、たとえば「invites/3」に表示されます。これは、送信された招待の数を公開するため、望ましくありません。代わりに、成功したすべての送信を「/thanks」ページにリダイレクトしたいと思います。

「rails カスタム URL」を調査しようとしましたが、機能するものを見つけることができませんでした。私が見つけることができた最も近いものは、カスタム ルートでリダイレクトする方法に関するこの Stackoverflow の投稿でしたが、推奨されるソリューションを完全には理解していませんでした。Rails Guide on Routesも読んでみましたが、これは初めてで、カスタム URL の作成を許可するものは何もありませんでした。

「views/invites/show.html.haml」に、フォームの送信が成功したときに表示される感謝のメッセージを配置しました。

私のルートファイル

resources :invites
root :to => 'invites#new'

routes.rb に挿入してみました:

post "/:thanks" => "invites#show", :as => :thanks

しかし、これが機能するかどうか、またはコントローラーにリダイレクトするように指示する方法がわかりません:thanks

私のコントローラー(基本的にバニラレール、ここに含まれる関連するアクションのみ):

def show
    @invite = Invite.find(params[:id])
    show_path = "/thanks"

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

# GET /invites/new
# GET /invites/new.json
def new
  @invite = Invite.new

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

 # POST /invites
 # POST /invites.json
 def create
   @invite = Invite.new(params[:invite])

   respond_to do |format|
     if @invite.save
       format.html { redirect_to @invite }
       #format.js { render :action => 'create_success' }
       format.json { render json: @invite, status: :created, location: @invite }
     else
       format.html { render action: "new" }
       #format.js { render :action => 'create_fail' }
       format.json { render json: @invite.errors, status: :unprocessable_entity }
     end
   end
 end

確認を表示するための標準 URL を作成するのは、比較的簡単に思えます。これを達成する方法についてのアドバイスをいただければ幸いです。

4

3 に答える 3

3

フォームが送信されたときに実行される作成アクションの後にリダイレクトしたいと思います。

次の方法で redirect_to を追加するだけです。

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

  if @invite.save
    ...
    redirect_to '/thanks'
  else
    ...
    redirect_to new_invite_path # if you want to return to the form submission page on error
  end
end

簡潔にするために一部のコードを省略しました。

ルートに次を追加します。

get '/thanks', to: "invites#thanks"

招待コントローラーに感謝アクションを追加します。

def thanks
  # something here if needed
end

そして、app/views/invites に thank.html.erb ページを作成します。

于 2013-04-10T20:09:51.557 に答える
0

次のようなルートを作成できます。

resources :invites do
  collection do
    get 'thanks'
  end
end

これにより、 というパス ヘルパーも作成されthanks_invites_pathます。

それはinvites/thanksパスになりますが、オンにしたい場合/thanksは、ジェイソンが述べたように行うことができます:

get "/thanks" => "invites#thanks", :as => :thanks

パーツは、そのasページにアクセスするためのヘルパーを生成します: thanks_path.

と呼ばれるコントローラーに追加のアクションが必要になり、thanks必要な情報を内部に入れます。また、と呼ばれる追加のビューが必要になりますthanks.html.erb

送信が成功した後に全員がそのページに移動するようにするため、作成アクションでは次のようになります。

format.html { redirect_to thanks_invites_path}(またはthanks_path)、何を選択しても、ルートに名前を付けるとrake routes、それが問題ないかどうかを確認できます。何を言っても、最後rake routesに追加するだけです._path

于 2013-04-10T19:53:58.090 に答える