0

私はRailsが初めてです。人がフォーム (または以下のコードで呼び出されるリストに存在する他のエンティティ) に「entity1」とENTITIES入力すると、フォームにその関係が表示されるようにしたいと考えています。エンティティがエンティティのリストに含まれているかどうかを確認するタスクは成功しました。呼び出された関係を出力する方法がわかりませんRELATION_SHIPS。私は試した:

#puts EntityList::RELATION_SHIPS[params[:user][:entity_name]] 

しかし、テンプレートが見つからないかRELATION_SHIPS、認識されないというエラーが表示されます。これを解決するにはどうすればよいですか?

#users_controller.rb

class EntityList

  ENTITIES = ['entity1','entity2','entity3']
  #entity1 = {:name => 'Entity One',:position => 1 :relationships => 'entity2', 'entity4'}

  RELATION_SHIPS = {:entity1 => "entity2", :entity2 => "entity3"}
end

class UsersController < ApplicationController
  layout 'admin'
  #require File.expand_path('././myconfig')  #=> C:/ruby/require/expand_path/ok.rb    loaded

  def new
    @user = User.new
  end

  def create
    if EntityList::ENTITIES.include?(params[:user][:entity_name])
      flash[:notice] = "The entity you entered is valid!!"

      redirect_to(:action => "helloworld")

      #puts EntityList::RELATION_SHIPS[params[:user][:entity_name]]
    else
      redirect_to(:action => "SorryPage")
    end
  end
end
4

4 に答える 4

1

まず、put の代わりに Rails.logger.debug を使用してみてください。テンプレートエラーに関しては、おそらく次のリクエストから発生しています-別のアクションにリダイレクトすると言います。「helloworld」と「Sorrypage」のメソッドとテンプレートはありますか?

スタイルに関しては、この例全体が非常に間違っています。Rails スタイルで物事を行わない場合は、痛みを求めます。

まず、EntityList をモデルに移動し、単に定数を公開するのではなく、情報を取得するメソッドを追加します。あなたの例では、ENTITIES と RELATION_SHIPS の間に冗長な情報がありました (なぜアンダースコアなのですか?)。Rails の基本的な哲学は、"Don't Repeat Yourself" です。ハッシュだけを使用し、ハッシュのメソッドを使用することで、これらの定数を DRY できます。

class EntityList

  ENTITIES = {:entity1 => "entity2", :entity2 => "entity3"}

  def self.valid_entity(e)
    ENTITIES.has_key?(e)
  end

  def self.entity_name(e)
    ENTITIES[e]
  end

end

そしてそれをコントローラーで使用します:

  def create
    if EntityList.valid_entity(params[:user][:entity_name])
      flash[:notice] = "The entity you entered is valid!!"
      redirect_to(:action => "hello_world")
    else
      redirect_to(:action => "sorry_page")
    end
  end

これにより、コントローラーがいかに短くて便利であるかがわかりますか? アクションを変更したことに注意してください。Rails の規則に合わせて、少なくとも小文字のアンダースコアを使用する必要がありますが、REST スタイルのアクションに変更した方がよいでしょう。

ルート ファイルがそれらを受け入れるように設定されていること、およびそれらのアクションのメソッドとテンプレートがあることを確認してください。

最後に、パラメーターは、これがユーザー オブジェクトを含むフォームの一部であることを示しています。リダイレクトすると、そのフォーム データがすべて失われます。あなたはそれを解決する必要があります。実際には、ENTITY 全体が User モデルの検証である必要があり、その後 create メソッドで新しいユーザーを作成して、標準の scaffold のように保存できます。

于 2012-07-24T13:58:00.487 に答える
0

Douguiが言ったように、リダイレクトメソッドの後で何もできません。また、ブラウザでリレーションシップを印刷しようとしている場合は、「ビュー」で印刷する必要があります。'Puts'メソッドは、コマンドプロンプトに何でも出力します。

于 2012-07-24T12:02:31.743 に答える
0

ここには明確な問題と、起こり得る問題があります。考えられる問題はputs、文字列の場合、その出力が Web ブラウザーに送信される出力ではなく、端末に表示されることです。出力を Web ブラウザーに表示する場合は、コントローラーに @variable を設定するか、コントローラーで a を作成しhelper_methodてビューから呼び出すことにより、何らかの方法でそれをビューに配置する必要があります (後者が私の好みです)オプション)。ただし、出力をデバッグする場合は、プットを使用してターミナル (レール s の場合) またはログ (pow、パッセンジャーなどの場合) に出力することは問題ありません。

明確な問題は、もしあなたがputs nil、(改行を除いて)何の出力も期待できないということです。RELATION_SHIPSハッシュのキーはシンボルです。params[:user][:entity_name]は文字列です。シンボルでキー付けされたハッシュで文字列を検索すると、nil が返されます。これは、観察によるputs nilと、少し退屈です。ハッシュにキーを付けるために使用している値RELATION_SHIPSを呼び出したいと思うかもしれませんが、おそらく無関心なアクセスでハッシュを作成したいと思うでしょう。.to_sym

于 2012-07-24T12:32:09.880 に答える
0

redirectメソッドの後は何もできませんでした。前にこれをしなければなりません...

編集:コードを追加

  def create
    if EntityList::ENTITIES.include?(params[:user][:entity_name])
      flash[:notice] = "The entity you entered is valid!!"
      puts EntityList::RELATION_SHIPS[params[:user][:entity_name]]
      redirect_to(:action => "helloworld")
    else
      redirect_to(:action => "SorryPage")
    end
  end

app/views/users/helloworld.html.erb を作成し、結果をコンソールに表示します。

于 2012-07-24T11:43:56.800 に答える