Czy istnieje sposób uniknięcia automatycznego zapisywania obiektu podczas przypisywania atrybutów kolekcji (metoda collection_singular_ids = ids)?Railsy 3 nie mogą wykonywać sprawdzania poprawności dla persytowanego obiektu podczas użycia metody collection_singular_ids = ids
Na przykład Mam następujący model Test i pakiet, pakiet ma wiele testów. Użytkownik może zbudować pakiet pakietów z liczbą testów.
No problem na walidację gdy obiekt jest nowy pakiet.
1.9.2 :001> package = Package.new(:name => "sample", :cost => 3.3, :test_ids => [1,2,3,4])
=> #<Package id: nil, name: "sample", cost: 3.3>
1.9.2 :002> package.test_ids
=> [1, 2, 3, 4]
1.9.2 :003> package.save
=> false
1.9.2 :004> package.save!
ActiveRecord::RecordInvalid: Validation failed: This package should have at most three tests
1.9.2: 005> package.test_ids = [1,2]
=> [1, 2]
1.9.2 :005> package.save!
=> true
Ale nie mogłem trafić at_most_3_tests metodę z utrzymywały pakiet obiektu.
Dołącz rekord tabeli jest tworzony bezpośrednio przy przypisywaniu IDS testowych
1.9.2: 006> package
=> #<Package id: 1, name: "sample", cost: 3.3>
1.9.2: 007> package.test_ids
=> [1,2]
1.9.2: 007> package.test_ids = [1,2,3,4,5]
=> [1,2,3,4,5]
1.9.2: 008> package.test_ids
=> [1,2,3,4,5]
wymóg klient jest interfejs rozwijanej wyboru wielu testów w postaci pakietu a także wykorzystywane select2 jquery plugin do listy rozwijanej. Kod Rhmtl wygląda
<%= form_for @package do |f| %>
<%= f.text_field :name %>
<div> <label>Select Tests</label> </div>
<div>
<%= f.select "test_ids", options_for_select(@tests, f.object.test_ids), {}, { "data-validate" => true, :multiple => true} %>
</div>
Proszę mi pomóc rozwiązać ten problem.
Nie mogę połączyć się z pakietem. ponieważ każdorazowe przypisanie tablicy identyfikatorów powoduje automatyczne zapisanie akcji. Na przykład package.test_ids = [1,2,3,4,5] –
@ManivannanJeganathan Aktualizuję moją odpowiedź, aby użyć tej walidacji 'has_many: tests,: length => {: maximum => 3}' –
Moja walidacja nie jest tylko na podstawie długości. Podałem tylko przykładowy kod. parametry [: pakiet] powinny zawsze mieć parametry test_ids, takie jak {: cost => 3.4,: test_ids => [1,2,3,4,5]}. Po prostu muszę zastosować metodę sprawdzania poprawności w modelu pakietu i formie renderowania, jeśli nie przejdzie sprawdzania poprawności. Potrafię użyć metody sprawdzania poprawności za pomocą odpowiedzi, nazywając '' 'validates_associated: package''' w modelu PackageTest. Ale jeśli sprawdzanie poprawności nie powiedzie się w związku z sprawdzaniem poprawności test_ids, zgłaszany wyjątek zamiast zwracania wartości true lub false. Kod ex "' 'if @ pakiet.update_attributes parametry [: pakiet] inny render" formularz "' '' –