我有模型User和Group,以及使用has_many:through方法的连接表Membership。在我的连接表的表单中,我希望用户输入管理员创建的有效组名,以成为该组的成员。
我已经得到了输入有效名称的情况但现在我需要一些验证,如果他们输入一个空白文本框,或者输入的组名存在于数据库中,我想要一些很好的错误消息。我认为这可以通过一些验证方法来实现吗?
会员资格部分 _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 %>
membership.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
答案 0 :(得分:1)
将以下内容添加到您的群组模型中:
validate_uniqueness_of :name, :message => "a group already exists with that name"
validate_presence_of :name
为您要插入的所有表调用验证。
编辑:
按照以下方式更改您的控制器:
@membership = current_user.memberships.build(:group => @group)
你将不再获得在nil错误上调用的id。如果@group为nil,则会员资格中的验证将在保存尝试时获取。
答案 1 :(得分:0)
我通过将文本输入框更改为选择字段来解决此问题,并将向模型添加密码字段以解决我的不受欢迎用户加入群组的问题。
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'