Rails で:モデルに関連付けられていないフォームからユーザー入力を取得し、その結果をコントローラー内で使用します
-
01-07-2019 - |
質問
これは私がやろうとしていることの簡略版です:
- 他のアクションを実行する前に、文字列を取得するためのフォームをユーザーに提示します。
- 文字列を入力し、デフォルトのコントローラーアクション (例:索引)。文字列が存在するだけでよく、他の検証は必要ありません。
- この文字列は、このコントローラーのすべてのアクションで (インスタンス変数として?) 使用できる必要があります。
私は Rails の初心者ですが、それほど難しいものではないようなので、ちょっとバカな気分になっています。
私が試したこと:私は持っています before_filter
次のようなプライベート メソッドにリダイレクトします。
def check_string
if @string
return true
else
get_string
end
end
の get_string
メソッドは次のようになります
def get_string
if params[:string]
respond_to do |format|
format.html {redirect_to(accounts_url)} # authenticate.html.erb
end
end
respond_to do |format|
format.html {render :action =>"get_string"} # get_string.html.erb
end
end
同じアクション内に 2 つのレンダリングまたはリダイレクト呼び出しがあるため、これは失敗します。それを最初に取り出せます respond_to
, もちろん、しかし何が起こるかというと、コントローラーが get_string
方法。何が起こっているのかはある程度わかりますが、それを修正して抜け出す方法がわかりません。1 つのフォーム (ビュー) を表示し、入力文字列を取得して何かを実行し、通常どおり続行できる必要があります。
の get_string.html.erb
ファイルは次のようになります
<h1>Enter a string</h1>
<% form_tag('/accounts/get_string') do %>
<%= password_field_tag(:string, params[:string])%>
<%= submit_tag('Ok')%>
<% end %>
助けていただければ幸いです。
編集
ご返信ありがとうございます...
@ローリー・ヤング:そうです、私は誤解していました。何らかの理由で、ユーザーによって呼び出された特定のコントローラーのインスタンスはセッション全体にわたって存続し、Rails の魔法の一部は各ユーザー セッションに関連付けられたオブジェクトの追跡にあると頭の中で考えていました。振り返ってみると、なぜそれがあまり意味をなさないのか、そしてインスタンス変数を使用しようとした(永続すると思っていた)がなぜ機能しないのかがわかります。あなたにも感謝します:)
解決
問題の一部は、@string を設定していないことです。これには before_filter はまったく必要なく、単に使用できるはずです。
def get_string
@string = params[:string] || session[:string]
respond_to do |format|
if @string
format.html {redirect_to(accounts_url)} # authenticate.html.erb
else
format.html {render :action =>"get_string"} # get_string.html.erb
end
end
end
@string 変数をすべてのアクションで使用できるようにするには、それをセッションに保存する必要があります。
他のヒント
私もあなたのレールの概念が欠けているようです。ユーザーが見るすべてのページは異なるリクエストです。
あなたが何をしようとしているのかを誤解しているかもしれません。しかし、ユーザーに 2 ページを見てもらいたいようですが、
- 最初のページで文字列変数を設定します。
- 2 番目のページには、変数セットに何らかの形で依存しているページが表示されます。
これを行う最善の方法は、変数の存在をチェックするフィルターの前に、変数が設定されていない場合はフォームにリダイレクトし、それ以外の場合は続行することです。
class MyController < ApplicationController::Base
before_filter :require_string
def require_string
return true if @string #return early if called multiple times in one request
if params['string'] or session['string'] #depending on if you set it as a URL or session var
@string = (params['string'] or session['string'])
return true
end
#We now know that string is not set
redirect_to string_setting_url and return false #the return false prevents any futher processing in this request
end
end
これは、RestfulAuthentication のようなプラグインがどのように機能するかの基本的な考え方です。その場合、「文字列」はログイントークン(ユーザーIDだと思います)で、セッションに保存されます。
見てみると、 login_required' action in
ResultfulAuth からのAuthenticated_system.rb`:基本的にこれを実行しますが、さらにいくつかのエラー修正やその他の要素が追加されています。