案例:
我的电台表格包含一个slug字段,如果输入一个值,它应该用作slug。
编辑:一些澄清:
我想要的就像slupress在wordpress中的工作原理:
我的问题:
无法弄清楚如何让友情ID使用用户提供的slu ..
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 :(得分: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
答案 1 :(得分:1)
要更改用作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
%>