在params hash中使用rails自定义键

时间:2014-03-14 19:57:08

标签: ruby-on-rails forms controller params has-and-belongs-to-many

我的模型CommunityPartner与另一个模型has_and_belongs_to_manyPartnerTag的关系。

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

2 个答案:

答案 0 :(得分:0)

您可以结合使用宝石acts_as_taggable_onchosen-rails来减少用户错误(分隔标记时不包括空格。

作为可标记的行为

简单且维护的gem,用于向Rails模型添加标记。

选择Rails

将文本框转换为基于令牌的文本框,类似于SO标记的工作方式。

https://github.com/tsechingho/chosen-rails

答案 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添加到控制器中允许的属性列表中。