【问题标题】:rails custom key in params hash参数哈希中的rails自定义键
【发布时间】:2014-03-14 19:57:08
【问题描述】:

我有一个模型 CommunityPartner 与另一个模型 PartnerTaghas_and_belongs_to_many 关系。

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

【问题讨论】:

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


    【解决方案1】:

    听起来您只需要在您的CommunityPartner 模型中添加一个attr_accessor。即

    class CommunityPartner < ActiveRecord::Base
       attr_accessor :tag_list
    end
    

    然后您可以将该属性添加到您的表单中,并以params[:community_partner][:tag_list] 的身份从params 访问它。这也将清理您的 create_tag_list 方法,因为您不需要传递参数。请记住将:tag_list 添加到控制器中允许的属性列表中。

    【讨论】:

    • 谢谢,这正是我一直在寻找的答案,抱歉我没能早点找到。
    【解决方案2】:

    您可以使用 gems acts_as_taggable_onchosen-rails 的组合来减少用户错误(不包括分隔标签时的空格。

    作为可标记在

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

    选择的导轨

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多