2

RoR初心者です。フォーム コントローラーで単純なメソッドを呼び出す方法の概念が、自分の視点からは理解できません。ビューから 2 つの情報を収集し、フォーム コントローラーでパラメーターに基づいて情報を取得するメソッドを呼び出し、同じビューまたは別のビューに情報を表示したいと考えています。現在、フォーム コントローラー インスタンス変数を使用して新しい情報を表示しようとしていました。ビューを更新して表示する方法がわかりませんが、それは将来のハードルです。現在、エラーが発生することなく [送信] ボタンをクリックできますが、明らかにフォーム コントローラー メソッドにヒットしていません。ビュー用の私のerbファイルは次のとおりです。

<h1>Enter Required Information</h1>

<%= form_tag (get_hotel_recommendation_path) do %>
  <%= label_tag(:name, "Name:") %>
  <%= text_field_tag(:name) %>
  <%= label_tag(:date, "Date (yyyy-mm-dd):") %>
  <%= text_field_tag(:date) %>
  <%= submit_tag("Submit") %><br><br>
  <%= label_tag(:recommendation, "Recommendation:") %>
  <%= @recommended_hotel_name %>
<% end %>

ここに私のフォームコントローラーコードがあります:

class RecommendHotelController < ApplicationController

  @recommended_hotel_name = ''

  def collect_info

  end

  def get_hotel_recommendation
    @recommended_hotel_name = Member.recommended_hotel_name( params[:name], params[:date] )
  end

end

私は本当にこれを行うためのシンプルで簡単な方法が欲しいだけです-必ずしも最善ではありません. モデル コードを示すための簡単な UI が必要です。そして、私はすぐにそれを成し遂げる必要があります。

新しいフォーム コントローラ コード:

class RecommendHotelController < ApplicationController

  def collect_info
  end

  def get_hotel_recommendation
    redirect_to recommend_hotel_path
  end

  protected

    helper_method :recommended_hotel_name
    def recommended_hotel_name
      unless (params[:name].nil?)
        Member.recommended_hotel_name(params[:name], params[:date])
      end
    end

end
4

2 に答える 2

2

コントローラーがビューに渡されると、追加のメソッドを呼び出すために戻ることはできません。ビューが必要とする可能性のあるすべてのものを事前に準備するのは、コントローラーの仕事です。フェーズに入るrenderと、コントローラー メソッドを呼び出す方法はありません。

これに対する例外は、呼び出すことができるヘルパー メソッドです。ビュー内で使用するメソッドを明示的に宣言する必要があります。例として:

helper_method :get_hotel_recommendation
def get_hotel_recommendation
  # ...
end

ヘルパー メソッドは、関連するヘルパー モジュール内に配置することもできます。ビュー内だけで使用する場合は、そこに配置することをお勧めします。

あなたの場合、これを一度だけ使用している場合は、おそらくインスタンス変数への割り当てをスキップして、問題のオブジェクトを返す必要があります。ビューは次のようになります。

<%= recommended_hotel_name %>

調整されたコントローラーの方法:

class RecommendHotelController < ApplicationController
protected
  helper_method :recommended_hotel_name
  def recommended_hotel_name
    Member.recommended_hotel_name(params[:name], params[:date])
  end
end

クラス コンテキストでの宣言@recommended_hotel_name = ''は、おそらく意図したものではないことに注意してください。これにより、インスタンス変数ではなく、クラス変数が作成されます。コントローラーのインスタンス変数は、プライマリ アクション メソッド内またはメソッド内で定義する必要がありますbefore_filter。また、インスタンス変数はnilデフォルトであることに注意してください。そのため、最初にインスタンス変数を初期化する必要はありません。空の文字列とnilビュー内で使用する場合は同等です。内部のすべて<%= ... %>が自動的に文字列に変換されます。

注意すべきもう 1 つのことは、メソッド名とその引数の間にスペースを残すことです。であってはなりform_tag(...)ませんform_tag (...)。通常、これは違いを生むことはありません。Ruby は非常に寛容ですが、問題を診断しようとすると、引数の解釈方法が微妙に変更され、多くの混乱を招くことがあります。ifスタイル的に言えば、 ,whileのようなキーワードのみでcase、これらはメソッド呼び出しではないため、ブラケットの前にスペースがあります。

フォームが機能しない理由については、明確ではありません。これらのパラメーターは意図したとおりに送信する必要がありますが、正しいルーティングが得られない可能性があります。index風変わりなことをしている場合を除き、標準の 、newshow、およびedit名前に固執するのが最善であることを忘れないでください。この場合、index複数のレコードを表示するかshow、常に 1 つのレコードであるかのように定義する必要があります。

于 2013-04-07T08:25:11.687 に答える
0

params配列内のフォーム送信からすべての情報を取得できます。ただし、あなたの例から、別の form_tags を使用する代わりに、form_for を使用することをお勧めします。

于 2013-04-07T08:16:27.250 に答える