百宝箱第一集:自定义Model网址

前提

像这种resources :events这样的路由,推荐使用自定义网址。
有三种方案:

方案一. 在modles/events加入:

def to_param
   "#{self.id}-#{self.name}"
end

这样就会产生Id和相对于的名称网址了。

方案二:乱数ID

1. rails g migration add_friendly_id_to_events

加入:

def change 
   add_column :events, :friendly_id,  :string
   add_index :events, :friendly_id,  :unique => true 
Event find each do |e|
   e.update( :friendly_id => SecureRandom.uuid) 
end 
end

rake db:migrate

2.在app/controllers/events_controllerapp/controllers/admin/events_controller,把show,edit,update,destroy的find都改为:find_by_friendly_id!
3. 修改event.rb
+ before_validation        :generate_friendly_id, :on => :create 

 def to_param
-    "#{self.id}-#{self.name}"
+    self.friendly_id
 end
 
+ protected
+ def generate_friendly_id
+   self.friendly_id ||= SecureRandom.uuid
+ end

end
4.解说

add_index :events, :friendly_id, unique => true中unique的作用是限制friendly_id属性的值是唯一的。

before_validaton :generate_friendly_id, :on => :create on选项是限制为create action的。在create action的验证前先调用自定义的方法,这里是个新的event赋予乱数id,其它的不是很懂。

方案三:用户自定义ID

编辑app/views/admin/events/_form.html.erb

<div class="form-group">
   <%= f.label :friendly_id %>
   <%= f.text_field :friendly_id, :required => true, :class => "form-control" %>
    <p class= "help-block"> 限小写英数字及横线,将作为网址的一部分 </p>

编辑app/controllers/admin/events_controller.rb

  def event_params
    params.require(:event).permit(:name, :description, :friendly_id)
  end 

加上一些资料验证:
app/models/event.rb

- validates_presence_of :name
+ validates_presence_or :name, :friendly_id

+
+validates_uniqueness_of :friendly_id
+validates_format_of :friendly_id, :with => \/A[a-z0-9\-]+\z/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,027评论 19 139
  • Awesome Ruby Toolbox Awesome A collection of awesome Ruby...
    debbbbie阅读 2,935评论 0 3
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,773评论 25 709
  • 在做 model 的 CRUD 时,一个resources :events这样的路由,它的 show 页面的网址总...
    vwin阅读 190评论 0 0
  • 连续数日的绵绵秋雨,像是没个终结,于这个孤寂清冷处,又惹来了多少思念和愁绪。 忙碌了整整一周,本该在家让身心都得到...
    一支爱写字的铅笔阅读 693评论 2 3