我的模型CommunityPartner
与另一个模型has_and_belongs_to_many
有PartnerTag
的关系。
class CommunityPartner < ActiveRecord::Base
VALID_EMAIL = /\A[\w+\-.]+@{1}[a-z\d\-.]+\.[a-z]+\z/i
validates(:name, presence: true, uniqueness: true)
validates(:email, presence: true, confirmation: true,
format: { with: VALID_EMAIL })
validates(:contact_method, presence: true)
validates(:email_confirmation, presence: true)
validates(:address, presence: true)
validates(:phone_number, presence: true)
validates(:description, presence: true)
has_many(:projects, dependent: :destroy)
has_and_belongs_to_many(:partner_tags)
has_secure_password
def create_tag_list(tag_list)
tag_list.each do |tag|
t = PartnerTag.new(name: tag.name)
self.partner_tags << t
end
end
end
class PartnerTag < ActiveRecord::Base
validates(:name, presence: true)
has_and_belongs_to_many(:community_partners)
end
我已经成功为新合作伙伴创建了一个表单,除了一件事:合作伙伴的标签。我创建了一个从数组中创建标记列表的方法。该数组由一个方法构成,该方法接受一个字符串并用空格分隔它(它在下面的控制器中)。如何自定义params
哈希,以便我可以从专门用于标记字符串的表单中包含自定义参数?或者,有更好的方法吗?
这是控制器代码:
class CommunityPartnersController < ApplicationController
def index
@all_partners = CommunityPartner.all
end
def new
@new_partner = CommunityPartner.new
end
def create
# create tag list from string passed in params[:community_partner][:pa rtner_tags]
# append each tag in list to partner instance
@new_partner = CommunityPartner.new(allowed_community_partner_params)
@new_partner.create_tag_list(parse_tags(params[:tags]))
if(@new_partner.save)
redirect_to(@new_partner)
else
render(:new)
end
end
def edit
end
def show
@partner = CommunityPartner.find(params[:id])
end
def update
end
def destroy
end
def parse_tags(tag_list)
tag_list.split(/ /)
end
private
def allowed_community_partner_params
params.require(:community_partner).permit(:name, :email,
:display_email, :email_confirmation, :contact_method,
:password, :password_confirmation, :phone_number,
:address, :description)
end
end
答案 0 :(得分:0)
您可以结合使用宝石acts_as_taggable_on
和chosen-rails
来减少用户错误(分隔标记时不包括空格。
作为可标记的行为
简单且维护的gem,用于向Rails模型添加标记。
选择Rails
将文本框转换为基于令牌的文本框,类似于SO标记的工作方式。
答案 1 :(得分:0)
听起来您只需要attr_accessor
模型中的CommunityPartner
。即。
class CommunityPartner < ActiveRecord::Base
attr_accessor :tag_list
end
然后,您可以将该属性添加到表单,然后从params
访问params[:community_partner][:tag_list]
。这也可以清除您的create_tag_list
方法,因为您不需要传递参数。请记住将:tag_list
添加到控制器中允许的属性列表中。