2013-11-14 4 views
6

Корпус:Пользователя редактируемые слизни с животными ID

Моих станций форма содержит поле слизняка, если значение вводится оно должно быть использовано в качестве заготовки.

EDIT: некоторые разъяснения:

То, что я хочу, это очень нравится, как слизни работать в WordPress:

  • Если нет пробкового не предусмотрено -> тихоход имя
  • Если пробкового предоставляется -> использовать введенный пользователем слизняка
  • Если пробкового обновляется -> толкать старую слизняка истории

Моя проблема:

Невозможно определить, как получить идентификатор Friendly, чтобы использовать предоставленный пользователем слизню.

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 

редактировать:

<%= 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

Можете ли вы показать форму? Сейчас вы используете имя для friendly_id. Все, что вам нужно сделать, это позволить пользователю изменить параметр имени. – ChrisBarthol

+0

Пользователь может изменить уже изменить параметр имени - я хочу, чтобы пользователь мог настроить slug - но приложение должно генерировать slug на основе имени, если нет slug предоставляется – max

+0

Я думаю, я смущен относительно что вы просите. Пользователь может изменить имя, поэтому они могут настроить слизню. Если вы хотите, чтобы slug, сгенерированный из другого параметра, вы просто имели бы 'friendly_id: parameter,: use => [: slugged,: history]' – ChrisBarthol

ответ

4

Это, как я ее решил:

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

Что делать, если есть конфликт? Например, если пользователь предоставляет пули, которые уже используются? – mscriven

+0

@mscriven, по умолчанию friendly-id разрешит его, сделав пул уникальным, добавив хэш, например, «foo-cdeea311-1957-4fab-b649-dd2a2b9ad90d».Я думаю, вы могли бы использовать 'validates_uniqueness_of: slug', если вы хотите применить его с проверками Active Record. – max

1

Чтобы изменить параметр используется как слизняк вам просто нужно изменить 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 

Тогда по вашему мнению, просто способ для пользователя изменить имя slug, следуя вашему представлению:

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

Извините, если я не смог объяснить, но это пропустило отметку. Большое спасибо за ваши усилия! – max