2017-01-30 22 views
0

私はニュースレター管理フォームを作成しています。私はsimple_formを使いたいと思います。 emailパラメータはPOSTメソッドを介してコントローラ/アクションemail_subscriber#manageに送信する必要があります。simple_formを使用してコントローラに任意のパラメータを送信する方法

routes.rbを

get 'email/login' => 'email_subscribers#login', as: 'email_login' 
get 'email/manage' => 'email_subscribers#manage', as: 'email_manage' 

email_subscribers_controller.rb

def login 

end 

def manage 
    @subscriber = EmailSubscriber.find_by_email(safe_params(:email)) 

    unless @subscriber 
     # redirect_to email_login_path, notice: 'That email does not exist.' 
    end 
end 

メール/ログインフォーム

<%= render :layout => 'application/container' do %> 
    <%= simple_form_for(@subscriber, path: :email_manage_path, method: :get) do |f| %> 
      <%= f.error_notification %> 

      <div class="form-inputs"> 
       <%= f.input :email, as: :email %> 
      </div> 

      <div class="form-actions"> 
       <%= f.button :submit, value: 'Manage Subscription' %> 
      </div> 
    <% end %> 

ログインルートは、フォームの場所です。それはニュースレターからの退会のためにユーザーが彼らの電子メールを入力することを可能にする。

対応するモデルが存在しないemailパラメータを渡して、フォームをmanageアクションにリダイレクトする必要があります。

現在のフォームは機能しません。何らかの理由で、EmailSubscribersインデックスページにリダイレクトされます。 POSTemail_manageルートを変更すると、フォームがemail_manage_pathに掲載されているので意味がありませんmissing route POST email/login、ないemail_login_path

おかげ

EDIT原因:

すくいルート出力を(この同じタブで開きます)

http://pastebin.com/eFGdvxid

+0

を? 'rake routes' –

+0

完全な' rake routes'出力を持つペーストビンを追加しました – danielbker

答えて

0

あなたは実際に代わり、従来のRESTfulなリソースとしてこれをモデル化することができます

resources :subscriptions 
namespace :subscriptions do 
    resources :logins 
    get '/login', to: 'logins/create' 
end 

利点は、あなたが標準的なCRUD動詞を以下のはるかに単純なセットアップを取得し、あなたも正しいHTTP動詞を使用することです。

ここでの唯一の型破りな部分は、私たちがGET経由createに追加のルートを追加することです:

# app/controllers/subscriptions/logins_controller.rb 
class Subscriptions::LoginsController < ApplicationController 
    rescue_from ActionController::ParameterMissing, with: :subscription_not_found 

    # GET /subscriptions/logins/new 
    def new 
    @subscription = Subscription.new 
    end 

    # POST /subscriptions/logins 
    # GET /subscriptions/login 
    def create 
    @subscription = Subscription.find_by_email(email_param) 
    if @subscription 
     redirect_to edit_subscription_path(@subscription) 
    else 
     subscription_not_found 
    end 
    end 

    private 

    def subscription_not_found 
    render :new, error: 'Email could not be found.' 
    end 

    def email_param 
    if request.post? 
     params.require(:subscription).fetch(:email) 
    else 
     params.fetch(:email) 
    end 
    end 
end 

私たちは実際には非常にまっすぐ進む方法でフォームを設定することができますリソースに結合されているので。また、ユーザーがリンクから直接ログインできるGETルートも追加しています。

フォームは非常に単純です。

<%= simple_form_for(@subscription, path: subscriptions_sessions_path) do %> 
    <%= f.error_notification %> 

    <div class="form-inputs"> 
    <%= f.input :email, as: :email %> 
    </div> 

    <div class="form-actions"> 
    <%= f.button :submit, value: 'Manage Subscription' %> 
    </div> 
<% end %> 

あなたは、ユーザーの編集をすることができますまたは解除ミルCRUDコントローラのかなりの実行作成することができます:あなたはあなたのルートを投稿することができ

# app/controllers/subscriptions_controller.rb 
class SubscriptionsController < ApplicationController 

    before_action :set_subscription, only: [:edit, :update, :destroy] 
    rescue_from ActiveRecord::RecordNotFound, with: :invalid_email 

    def new 
    @subscription = Subscription.new 
    end 

    def create 
    @subscription = Subscription.new(subscription_params) 
    if @subscription.save(subscription_params) 
     redirect_to root_path, success: 'Your subscription settings have been creates' 
    else 
     render :new 
    end 
    end 

    def edit 
    end 

    def update 
    if @subscription.update(subscription_params) 
     redirect_to root_path, success: 'Your subscription settings have been updated' 
    else 
     render :edit 
    end 
    end 

    def destroy 
    @subscription.destroy 
    redirect_to root_path 
    end 

    private 

    def set_subscription 
    @subscription = Subscription.find(params[:id]) 
    end 

    def subscription_params 
    params.require(:subscription).permit(:foo, :bar, :baz) 
    end 
end 
+0

私はそのシンクを入れるのに少し時間が必要でした。私はまだモデルなしでsimple_formをどのように使用するかを知りたいので、技術的に質問に答えませんが、私はあなたのアプローチが好きです。非常に賢い!答えを今自分のアプリに統合する。 – danielbker

+0

'ActiveModel :: Model'を含む「仮想」モデルを作成するか、プレーン古いレール・タグ・ヘルパーを使用して入力要素を作成するだけで、テーブルバックアップモデルなしでも使用できます。 SFはモデルなしでは動作しません。 – max

+0

また、ユーザーの電子メールをパラメータとして使用する代わりに、電子メールで送信するトークンを作成することをお勧めします。 http://api.rubyonrails.org/classes/ActiveRecord/SecureToken/ClassMethods.html – max

関連する問題