5

まず、Rails 3.0.9 と Ruby 1.8.7 を使用しています。画面上で検証してユーザーに完全に表示できなかったため、助けが必要です。

モデル:

class Book < ActiveRecord::Base
    belongs_to :genre
    validates_presence_of :title, :genre
    attr_accessible :genre_id
end

フォーム:

<div class="field">
    <%= f.label :genre %><br />
    <%= f.collection_select(:genre_id, Genre.all(:order => :name), :id, :name, :prompt => 'Select') %>
</div>

フォームを空白で送信すると(デフォルトでプロンプト値が選択されています)、「ジャンルを空白にすることはできません」というエラーメッセージが完全に表示されますが、フォームでは次のようなhtmlを受け取ります。

<div class="field">
    <div class="field_with_errors">
        <label for="book_genre">Genre</label>
    </div>
    <br>
    <select name="book[genre_id]" id="book_genre_id">
        <option value="">Select</option>
        <option value="2">Gramatic</option>
        <option value="1">Terror</option>
    </select>
</div>

CSS で定義した赤い背景のため、div.field_with_erros 内にも選択フィールドが必要です。

その後、 f.collection_select :genre_id を :genre に変更してみました

これで、div.field_with_erros 内に選択フィールドを取得しました。ええ、勝利です。しばらくの間、検証が常にエラーを非難することに気付くまで、レールは選択フィールド :genre が探している :genre_id であることを知りません。

私の質問は: 検証で :genre を :genre_id に変更するにはどうすればよいですか? それとも、皆さんはそれを行うためのより良い方法を持っていますか?

テストを続けて、ラベルとcollection_selectをgenre_idに変更しようとしましたが、検証は完全に機能しますが、div.field_with_errorsでhtmlを生成しないので、validates_presence_ofに:genre_idを入れようとしたので、次のようになりました: "validates_presence_of :title , :ジャンル, :ジャンル_id".

すごいけど…

  1. フォームを送信してデフォルトのプロンプト値を選択すると、検証は正常に機能しますが、1つは:genreに、もう1つは:genre_id(¬¬)に2つのエラーが発生しますが、htmlは問題なく、ラベルと選択はdiv内にあります.field_with_erros.

  2. フォームを送信し、ジャンルからいくつかの値を選択した場合、検証と html は問題ありません。

  3. フォームを送信しても、一部のオプションの値を無効なものに変更して、モデル間の検証が機能するかどうかをテストした場合、検証は実際には正常に機能しますが、html は div.field_with_erros を作成しません。

誰でも私を助けてくれますか?(はい、私の英語は最高ではありません。申し訳ありません!)

4

2 に答える 2

1

これをテストするために、いくつかの足場モデルを作成しました。2 つの移行をセットアップします。

class CreateGenres < ActiveRecord::Migration
  def change
    create_table :genres do |t|
      t.string :title
      t.timestamps
    end
  end
end

class CreateBooks < ActiveRecord::Migration
  def change
    create_table :books do |t|
      t.string :name
      t.references :genre
      t.timestamps
    end
  end
end

私が持っている形式で:

<%= f.label :genre_id %>
<%= f.collection_select(:genre_id, Genre.all(:order => :title), :id, :title, :prompt => 'Select') %>

そして、私が持っているモデルでは:

class Genre < ActiveRecord::Base
  attr_accessible :title
  has_many :books
end

class Book < ActiveRecord::Base
  belongs_to :genre
  validates_presence_of :name, :genre_id
  attr_accessible :name, :genre_id
end

その後、検証は期待どおりに機能します...

于 2012-11-21T16:24:24.970 に答える