Friendly Editable Custom Bullets

Happening:

My station forms contain a drain field, if a value is entered, it should be used as a bullet.

EDIT: some clarifications:

What I want is very similar to how bullets work in wordpress:

  • If there is no slug, → slug name
  • If there is slug -> use the user-entered pool
  • If updating slug -> push old slug to history

My problem:

There is no way to figure out how to get the Friendly ID to use a user-provided bullet.

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 :set_timezone! .... def should_generate_new_friendly_id? name_changed? or slug_changed? end end 

edit:

 <%= form_for(@station) do |f| %> <%= f.div_field_with_label(:name) do |key| f.text_field(key) end %> <%= f.div_field_with_label(:slug) do |key| f.text_field(key) end %> <%= f.div_field_with_label(:hw_id, 'Hardware ID') do |key| f.text_field(key) end %> <%= f.div_field_with_label(:latitude) do |key| f.text_field(key) end %> <%= f.div_field_with_label(:longitude) do |key| f.text_field(key) end %> <%= f.div_field_with_label(:user_id, "Owner") do |key| f.select(:user_id, options_from_collection_for_select(User.all, :id, :email), { include_blank: true }) end %> <div class="actions"> <%= f.submit %> </div> <% end %><%= form_for(@station) do |f| %> <%= f.div_field_with_label(:name) do |key| f.text_field(key) end %> <%= f.div_field_with_label(:slug) do |key| f.text_field(key) end %> <%= f.div_field_with_label(:hw_id, 'Hardware ID') do |key| f.text_field(key) end %> <%= f.div_field_with_label(:latitude) do |key| f.text_field(key) end %> <%= f.div_field_with_label(:longitude) do |key| f.text_field(key) end %> <%= f.div_field_with_label(:user_id, "Owner") do |key| f.select(:user_id, options_from_collection_for_select(User.all, :id, :email), { include_blank: true }) end %> <div class="actions"> <%= f.submit %> </div> <% end %> 
+6
source share
2 answers

Here is how I solved it:

 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 

And tests:

/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 
+4
source

To change which parameter is used as a bullet, you just need to change the friendly_id parameter:

 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 

Then, in your opinion, the user has the opportunity to change the name slug, following your view:

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

Source: https://habr.com/ru/post/958111/


All Articles