2013-12-18 3 views
1

Я хочу настроить проверку, чтобы люди не могли отправить сообщение, если только они не нажимают на категорию для этой записи, а также чтобы убедиться, что они могут выбрать только одну из категорий для этой записи поэтому почта может иметь только одну категорию. Вот modlesс использованием валидации с has_many_through

class Categorization < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :category 
end 

class Category < ActiveRecord::Base 
    has_many :categorizations 
    has_many :posts, :through => :categorizations 
end 

class Comment < ActiveRecord::Base 
    belongs_to :user 
    validates :content, presence: true, 
        length: { minimum: 5 } 
end 

class Post < ActiveRecord::Base 
    belongs_to :user 
    has_many :comments 

    has_many :categorizations 
    has_many :categories, :through => :categorizations 

    validates :title, :content, presence: true, 
        length: { minimum: 5, maximum: 140 } 
end 

также здесь моя форма:

<%= form_for @post, :html => {:multipart => true} do |f| %> 
    <% if @post.errors.any? %> 
    <div id="error_explanation" class="animated tada"> 
     <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2> 
     <ul> 
     <% @post.errors.full_messages.each do |msg| %> 
      <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 
    <div class="field"> 
    <%= f.label :title %><br> 
    <%= f.text_field :title %> 
    </div> 
    <div class="field"> 
    <%= f.file_field :image %> 
    </div> 
    <div class="field"> 
    <%= f.label :content %><br> 
    <%= f.text_area :content %> 
    </div> 
    <%= hidden_field_tag "post[category_ids][]", nil%> 
    <% Category.all.each do |category| %><br> 
    <%= check_box_tag "post[category_ids][]", category.id, @post.category_ids.include?(category.id), id: dom_id(category)%> 
    <%= label_tag dom_id(category), category.name %> 
    <% end %> 
    <div class="actions"> 
     <%= f.submit %> 
    </div> 
<% end %> 
</div> 

сделать любого из вас знает, что я должен были бы поставить в, чтобы моя форме вернуться с сообщением говоря необходимость выбора категории или может выбрать только одну категорию?

ответ

0

Мы сделали нечто подобное с has_many :through


Проверка на инфу Модель

Наше решение было использовать accepts_nested_attributes_for и проверки на модели соединения. Это можно рассматривать как весьма неэффективно, но работает хорошо для нас:

#app/models/message.rb 
Class Message < ActiveRecord::Base 
    validates :title, :body, 
     :presence => { :message => "Needs A Value!" } 
    accepts_nested_attributes_for :message_subscribers, :allow_destroy => true 
end 

#app/models/message_subscriber.rb 
Class MessageSubscriber < ActiveRecord::Base 
    #Validations 
    validates :subscriber_id, 
      :presence => { :message => "Your Message Needs Subscribers!" } 
end 

Это возвращает ошибку, если у вас нет каких-либо subscriber_id «S выбранные


Ваш код

Для вас у меня возникло бы желание:

class Categorization < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :category 

    #Validation 
    validates :subscriber_id, :presence => { :message => "You need to select a category!" } 
end 

class Post < ActiveRecord::Base 
    belongs_to :user 
    has_many :comments 

    has_many :categorizations 
    has_many :categories, :through => :categorizations 

    #Validation 
    validates :title, :content, presence: true, 
        length: { minimum: 5, maximum: 140 } 

end 

Я собирался включить accepts_nested_attributes_for для вас, но я понял, что это будет неудобный способ сделать то, что вы делаете. В свете этого я считаю, что вам может быть лучше всего подходит только проверка валидации в вашей модели соединения, однако, если это не сработает, мы добавим функцию accepts_nested_attributes_for

Смежные вопросы