2016-03-30 6 views
0

私はRailsでform_forを作成し、さらにPOSTリクエストで追加のパラメータを送信したいと思います。より多くのパラメータをレールform_forまたはPOSTで別の方法で送信してください

多くのアラートを持つAgencyクラスがあります。 Alertクラスは代理店に属します。ですから、もし私が@alertに格納されているAlertのインスタンスを持っていれば、@ alert.agencyと言うことができます。

それでも、Alert.createメソッドでは、@ alert.agencyにredirectすることができるはずです。しかし、私は最初に代理メソッドをcreateメソッドに渡していません。私はしたい、しかし私はどのようにわからない。


Alert.rb

class Alert < ActiveRecord::Base 
    belongs_to :agency 
end 

Agency.rb

class Agency < ActiveRecord::Base 
    has_one :account, as: :member, dependent: :destroy 
    has_many :alerts 
end 

AlertController.rb

class AlertController < ApplicationController 
    before_action :set_alert, only: [:show, :edit, :update, :destroy] 

    def new 
    @alert = Alert.new 
    end 

    def create 
    @alert = Alert.new(body: params[:body], severity: params[:severity]) 

    respond_to do |format| 
     if @alert.save 
     format.html { redirect_to @alert.agency, notice: 'Alert created.' } 
     format.json { render :show, status: :created, location: @alert} 
     end 
    end 
    end 

    private 
    def set_alert 
     @alert = Alert.find(params[:id]) 
    end 

    def alert_params 
     params.require(:alert).permit(:body, :severity, :agency_id) 
    end 
end 

私はAgenciesビューで配置した_create_alertという名前の部分を作成しました。 show.html.erbにレンダリングします。ここでは、次のとおりです。

_create_post.html.erb

<%= form_tag(alert_create_url) do %> 
    <div class="input-group"> 
     <div> 
     <%= text_area_tag :body, params[:body], placeholder: 'Type alert here' %> 
     </div> 
     <div> 
     <%= number_field_tag :severity, params[:severity], placeholder: 'Type alert here' %> 
     </div> 
     <div> 
     <%= submit_tag "Post", class: 'btn linky' %> 
     </div> 
    </div> 
    <% end %> 

私はそこにそれを置くために、より自然だと感じたので、私は/ビュー/機関でこの部分を置きました。私はそれがビュー/アラート/にあるという利点を見ませんでした。

私は代理店のIDをform_forで渡さないので問題が発生します。この情報もどうやって送ることができますか? 私はそれをセッションに格納していますので、Alert.create内のセッションからアクセスできますが、安全ではなく、ベストプラクティスではないと感じています。


私は二つの選択肢があると思う:

1.したときに、Agency.showビューから

2.のform_for使用して他のパラメータと代理店IDを渡しますユーザーが投稿をヒットHTML要素からテキストを取得し、@ agency.alerts.create()で渡すことができます

別のオプションがありますか?どちらの方法が好ましいのでしょうか? 上記のいずれかのオプションを実装するにはどうすればよいですか?

答えて

0

はあなたのform_for

<%= hidden_field_tag "parameter_name", session[:agency_id] %> 

を追加します。

次に、あなたにこれは汚い感じている。この

params[:parameter_name] 
+0

ようなあなたのコントローラでそれを得ることができます。私はビューでその論理を持つべきですか? –

+0

あなたはパラメータとして送信したいと述べていますが、入力タグを使用してフォーム内に置かない限り、パラメータを送信する方法はありません。あなたが述べたように、あなたのコントローラの代理店のIDに直接アクセスすることもできます。それはセッションに保存されているからです。 – Lymuel

+0

よく言い方が分かりませんでした。 Alert.createメソッドでアクセスしたいと思います。私がセッションでそれを保存していない場合、そこにアクセスできるように自分のコードを整理する良い方法はありますか? –

関連する問題