проверка модели объединения пользователей и групп - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть модели User и Group, а также таблица присоединения Membership, в которой используется метод has_many: through.В форме таблицы присоединения я хочу, чтобы пользователь ввел действительное имя группы, созданное администратором, чтобы стать членом этой группы.

Я получил случай, когда действительное имя введено для работы, но теперь мне нужна некоторая проверка, если они вводят пустое текстовое поле, или что введенное имя группы существует в базе данных, я хотел бы немного приятноСообщения об ошибках.Я думал, что это будет возможно с помощью некоторого метода validates?

частичное членство _form.html.erb

<%= form_for(@membership) do |f| %>
  <% if @membership.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@membership.errors.count, "error") %> prohibited this membership from being saved:</h2>

      <ul>
      <% @membership.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :group %><br />
    <%= f.text_field :group %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

members.rb

class Membership < ActiveRecord::Base
  belongs_to :group
  belongs_to :user

  attr_accessible :user_id, :group_id

  validates_uniqueness_of :group_id, :message => "can be only joined once", :scope => 'user_id'
  validates_presence_of :group, :user
end

group.rb

class Group < ActiveRecord::Base

  has_many :memberships, :dependent => :destroy
  has_many :users, :through => :subscriptions

  validates :name, :presence => true, :uniqueness => true

  attr_accessible :name, :expiry
end

Так что нужно какое-то направление относительно того, как происходит валидация, потому что вышеприведенная валидация в моделях членства и групп не работает, яполучить ошибку как для пустого текстового поля, так и для имени, которого нет в базе данных ...

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

Редактировать: Добавлен код контроллера ниже

  def create
    @group = Group.find_by_name(params[:membership][:group])
    @membership = current_user.memberships.build(:group_id => @group.id)

    respond_to do |format|
      if @membership.save
        format.html { redirect_to membership_url, :notice => 'Membership was successfully created.' }
        format.json { render :json => @membership, :status => :created, :location => @membership }
      else
        format.html { render :action => "new" }
        format.json { render :json=> @membership.errors, :status => :unprocessable_entity }
      end
    end
  end

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Добавьте следующее в модель вашей группы:

validate_uniqueness_of :name, :message => "a group already exists with that name"
validate_presence_of :name

Для всех таблиц, в которые вы вставляете, вызываются проверки.

Редактировать:

Изменить контроллер следующим образомthis:

@membership = current_user.memberships.build(:group => @group)

Вы больше не получите идентификатор, вызываемый при ошибке nil.И если @group равен нулю, проверка в вашем членстве подберет его при попытке сохранения.

0 голосов
/ 13 февраля 2012

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

  def create
    @groups = Group.current
    @group = Group.find_by_name(params[:membership][:group])
    @membership = current_user.memberships.build(:group_id => @group.id)

После этого моя модель проверки работает теперь ниже

  validates_uniqueness_of :group_id, :message => "can be only be joined once", :scope => 'user_id'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...