Rails で:モデルに関連付けられていないフォームからユーザー入力を取得し、その結果をコントローラー内で使用します

StackOverflow https://stackoverflow.com/questions/106711

  •  01-07-2019
  •  | 
  •  

質問

これは私がやろうとしていることの簡略版です:

  1. 他のアクションを実行する前に、文字列を取得するためのフォームをユーザーに提示します。
  2. 文字列を入力し、デフォルトのコントローラーアクション (例:索引)。文字列が存在するだけでよく、他の検証は必要ありません。
  3. この文字列は、このコントローラーのすべてのアクションで (インスタンス変数として?) 使用できる必要があります。

私は 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 ページを見てもらいたいようですが、

  1. 最初のページで文字列変数を設定します。
  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 inResultfulAuth からのAuthenticated_system.rb`:基本的にこれを実行しますが、さらにいくつかのエラー修正やその他の要素が追加されています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top