私は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()で渡すことができます
別のオプションがありますか?どちらの方法が好ましいのでしょうか? 上記のいずれかのオプションを実装するにはどうすればよいですか?
ようなあなたのコントローラでそれを得ることができます。私はビューでその論理を持つべきですか? –
あなたはパラメータとして送信したいと述べていますが、入力タグを使用してフォーム内に置かない限り、パラメータを送信する方法はありません。あなたが述べたように、あなたのコントローラの代理店のIDに直接アクセスすることもできます。それはセッションに保存されているからです。 – Lymuel
よく言い方が分かりませんでした。 Alert.createメソッドでアクセスしたいと思います。私がセッションでそれを保存していない場合、そこにアクセスできるように自分のコードを整理する良い方法はありますか? –