2013-11-14 12 views
6

koperty:Obsługi edycji ślimaki z przyjazną ID

Moi formy stacja zawierać pole ślimak, jeśli wartość nie jest wpisany powinien on być stosowany jako ślimak.

EDIT: niektóre wyjaśnienie:

Co chcę jest podobnie jak ślimaki pracować w WordPress:

  • Jeśli nie ślimak jest -> ślimak nazwę
  • Jeśli ślimak jest -> użyj wszedł użytkownika ślimak
  • Jeśli ślimak jest aktualizowana -> wcisnąć stary pocisk do historii

Mój problem:

Nie można ustalić, w jaki sposób uzyskać identyfikator Friendly ID, aby korzystać z dostarczonego przez użytkownika pliku.

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 %> 
+0

Czy możesz pokazać formularz? W tej chwili używasz nazwy dla friendly_id. Wystarczy, że zezwolisz użytkownikowi na zmianę parametru nazwy. – ChrisBarthol

+0

Użytkownik może zmienić już zmienić parametr nazwy - chcę tylko, aby użytkownik mógł spersonalizować slug - ale aplikacja powinna generować korek na podstawie nazwy, jeśli nie ma podanego pocisku. – max

+0

Chyba jestem zdezorientowany co do o co pytasz. Użytkownik może zmienić nazwę, w związku z czym może dostosować ślimak. Jeśli chcesz wygenerować slug z innego parametru, po prostu masz parametr friendly_id:, use => [: slugged,: history] ' – ChrisBarthol

Odpowiedz

4

ten sposób Rozwiązałem go:

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 

a testy:

/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 
+0

Co w przypadku konfliktu? Na przykład, jeśli użytkownik dostarczy ślimak, który jest już w użyciu? – mscriven

+0

@mscriven, domyślnie friendly-id rozwiąże to przez uczynienie unikalnego robaka przez dodanie skrótu, takiego jak 'foo-cdeea311-1957-4fab-b649-dd2a2b9ad90d'.Myślę, że możesz użyć 'validates_uniqueness_of: slug', jeśli chcesz wymusić to za pomocą walidacji Active Record. – max

1

Aby zmienić to, co parametr jest używany jako ślimak po prostu trzeba zmienić friendly_id parametr:

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 

Następnie w widoku po prostu sposób, aby użytkownik zmienił slugname, zgodnie z twoim widokiem:

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

Przepraszam, jeśli nie udało mi się wytłumaczyć, ale ta spudłowała. Ogromne dzięki za wysiłek! – max