用户可编辑的带有友好ID的slugs

案件:

我的工作站表格包含一个段塞字段,如果输入一个值,它应该用作段塞。

编辑:一些澄清:

我想要的就像slupress如何在wordpress中工作:

  • 如果没有提供slug – > slug这个名字
  • 如果提供了slug – >使用用户输入的slug
  • 如果slug更新 – >将旧slu push推到历史

我的问题:

无法弄清楚如何让友情ID使用用户提供的slug。

class Station  [:slugged, :history] before_save :set_timezone! .... def should_generate_new_friendly_id? name_changed? or slug_changed? end end 

编辑:

        

这就是我解决它的方式:

 class Station < ActiveRecord::Base extend FriendlyId belongs_to :user has_many :measures validates_uniqueness_of :hw_id validates_presence_of :hw_id class_attribute :zone_class self.zone_class ||= Timezone::Zone friendly_id :name, :use => [:slugged, :history] before_save :evaluate_slug before_save :set_timezone! def should_generate_new_friendly_id? if !slug? name_changed? else false end end end 

测试:

/spec/models/station_spec.rb

 describe Station do ... let(:station) { create(:station) } describe "slugging" do it "should slug name in absence of a slug" do station = create(:station, name: 'foo') expect(station.slug).to eq 'foo' end it "should use slug if provided" do station = create(:station, name: 'foo', slug: 'bar') expect(station.slug).to eq 'bar' end end ... end 

/spec/controllers/stations_controller.rb

 describe StationsController do ... describe "POST create" do it "creates a station with a custom slug" do valid_attributes[:slug] = 'custom_slug' post :create, {:station => valid_attributes} get :show, id: 'custom_slug' expect(response).to be_success end ... end describe "PUT update" do it "updates the slug" do put :update, {:id => station.to_param, :station => { slug: 'custom_slug' }} get :show, id: 'custom_slug' expect(response).to be_success end ... end ... end 

要更改用作slug的参数,只需更改friendly_id参数:

 class Station < ActiveRecord::Base extend FriendlyId belongs_to :user has_many :measures validates_uniqueness_of :hw_id validates_presence_of :hw_id class_attribute :zone_class self.zone_class ||= Timezone::Zone friendly_id :SLUGNAME, :use => [:slugged, :history] before_save :set_timezone! .... def should_generate_new_friendly_id? name_changed? or SLUGNAME_changed? end end 

然后在您的视图中,让用户可以根据您的视图更改slugname:

 <%= f.div_field_with_label(:SLUGNAME) do |key| f.text_field(key) end %>