3

データを別のコントローラー/アクションに投稿してから別のページにリダイレクトするフォームを作成しようとしています。

フォームを持つ私のテンプレート:

<%= form_for @url, :url => { :controller => "url", :action => "create" }, :html => {:method => :post} do |f| %>
    <%= f.text_field :url, :placeholder => "http://" %>
   <%= f.submit "Kürzen", :class => "btn" %>
<% end %>

私のurl_controller:

class UrlController < ApplicationController
  def create
    redirect_to shorturl_path
  end
end

私のルート:

Ssurl::Application.routes.draw do
  get 'shorturl' => 'landingpage#shorturl', :as => :shorturl
  post '/url/create' => 'url#create'
  root :to => 'landingpage#index', :as => :landingpage
end

フォームを送信すると、フォームのパラメーターを取得してページがリロードされますか? したがって、2 つのエラーがあります。

  1. フォームは投稿の代わりに取得を使用しますか?
  2. リダイレクトが機能しない

どうしたの?

4

2 に答える 2

4

コントローラーとアクションを指定して URL を生成しようとしているようですがform_for、routes.rb でこのルートをマッピングしていません。

したがって、2 つのオプションがあります。form_for1 つ目は、次のように で URL を「ハードコード」することです。

<%= form_for @url, :url => "/url/create", :html => {:method => :post} do |f| %>

しかし、はるかに優れた解決策は、ルートを RESTful な形にすることです。

あなたはこれを行うことができます:

Ssurl::Application.routes.draw do
  get 'shorturl' => 'landingpage#shorturl', :as => :shorturl
  resource :url, :only => [:create]
  root :to => 'landingpage#index', :as => :landingpage
end

POST http メソッドを使用して RESTful 作成ルートを作成します。したがって、次のform_forようになります。

<%= form_for @url do |f| %>

もっときれいに!

于 2013-01-17T12:51:54.360 に答える
1

url_for別のコントローラーのアクションにアクセスする ユーザー-

form_for @url, :url => url_for(:controller => 'url', :action => 'create')

リダイレクトの問題の場合-

コントローラは、相互に通信するためのものではありません。URLを作成した後で何かをしたい場合は、それをモデルのメソッドにして、UrlControllerから呼び出します。モデルにafter_saveコールバックを追加することもできますが、特に複雑な場合は、コールバックが混乱を招く可能性があることに注意してください。

どのメソッドがどのオブジェクトに適用されるかを慎重に検討してください。それはどこに属しますか?コントローラーはかなり単純である必要があります。リソースを取得して表示するか(GETリクエストの場合)、1つのアクションを実行してGETページにリダイレクトします。やりたいことがモデルに属していない場合は、サービスクラスまたは別のモデルを作成します。

于 2013-01-17T13:17:40.873 に答える