【问题标题】:Friendly ID does not create new slugs on new inviations (devise-invitable)友好的 ID 不会在新邀请上创建新的 slug(设计邀请)
【发布时间】:2014-08-25 04:21:20
【问题描述】:

当我使用 devise-invitable 在我的 Rails 4 应用程序中邀请用户时,应用程序不会创建新的友好 ID。我的 user.rb 文件中有以下代码

extend FriendlyId
friendly_id :name, :use => :slugged
def should_generate_new_friendly_id?
  after_invite_path_for? || new_record? || name_changed? || slug.blank? || super
end

我尝试了很多不同的选项,但似乎无法弄清楚

【问题讨论】:

    标签: ruby-on-rails-4 devise friendly-id devise-invitable


    【解决方案1】:

    假设您在邀请接受过程中收集您的受邀者姓名,这可以通过将其添加到您的控制器来实现:

    应用控制器

    before_filter :configure_permitted_parameters, if: :devise_controller?
    
    protected
    
    def configure_permitted_parameters    
       devise_parameter_sanitizer.for(:accept_invitation).concat([:name, :slug])
    end
    

    【讨论】:

      【解决方案2】:

      如果您想在创建邀请时创建 slug:

      我也遇到了同样的问题。

      我用来邀请用户的命令:
      User.invite!(email: "example@email.com", name: "John John")

      问题是由于某种原因,should_generate_new_friendly_id? 在此过程中没有被调用。

      我的解决方案是编写一个方法来创建用户 slug

      def slug_me!
        new_slug = [name.parameterize].join("-")
        if User.where(slug: new_slug).present? #check if the is a user with that slug already
          new_slug = [name.parameterize, User.last.id+1].join("-")
        end
        update_column(:slug, new_slug)
      end
      

      (在我的应用中,new_slag 将是独一无二的。不确定您的应用。您可能需要将 [name.parameterize, User.last.id+1].join("-") 更改为适合您需要的其他内容)

      并覆盖设计使用的invite! 方法:

      def invite!
        super
        slug_me! if should_generate_new_friendly_id?
      end
      

      (我已经添加了if should_generate_new_friendly_id?,所以如果您多次邀请同一个人,它不会产生蛞蝓)

      在这种情况下should_generate_new_friendly_id? 将返回true,因为slugnil 所以slug.blank? 将返回true

      它可能不是最好的解决方案,但它对我有用。 (我仍在寻找更好的解决方案)

      【讨论】:

      • FriendlyId 有一个私有方法 set_slug-- 使用该 imo 比重新实现所有逻辑更好。如果您在模型中,您可以使用user.send(:set_slug) 或仅使用send(:set_slug) 调用它。请注意,这不会保存记录——我在set_slug 之后调用user.save(validate: false) 进行保存,但您的用例可能会有所不同。与使用任何私有方法一样,请确保您有一个涵盖此问题的测试,以便在 FriendlyId 将来更改其实现时您会发现它。
      【解决方案3】:

      我遇到了同样的问题:

      User.invite!(email: "example@email.com", name: "John John")
      

      我的解决方案是:

      before_invitation_created :generate_slug
      
      private
      
        def generate_slug
          return unless slug.nil?
      
          self.slug = set_slug
        end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多