ซ่อนรหัสผู้ใช้ในแถบ URL

ในแอปพลิเคชัน Rails ของฉัน ขณะนี้ฉันมีผู้ใช้จำนวนมากซึ่งแต่ละคนมีรหัสผู้ใช้ที่ลงทะเบียนแล้ว

ถ้าฉันเข้าไปที่ดัชนีผู้ใช้ของฉันและคลิกที่หน้าแสดงผู้ใช้ ฉันจะได้รับส่วนหัวตัวอย่างต่อไปนี้

โลคอลโฮสต์:3000/ผู้ใช้/3

ตอนนี้ฉันไม่ชอบสิ่งนี้เพราะมันทำให้ผู้คนสามารถข้ามผู้ใช้ในส่วนหัวได้อย่างง่ายดาย

ฉันจะทำอย่างไรต่อไปนี้เพื่อให้แสดงฟิลด์ user.username แทนเช่น

localhost:3000/ผู้ใช้/adamwest


person user1222136    schedule 08.03.2012    source แหล่งที่มา


คำตอบ (1)


คุณสามารถกำหนดวิธีการ to_param ในโมเดลผู้ใช้ได้

class User
  ...
  def to_param
    name
  end
  ...
end

จากนั้นทุก URL ที่สร้างขึ้นจะมี name แทนที่จะเป็น id เป็นตัวระบุผู้ใช้

sid = User.new :name => 'sid'
user_path(sid) #=> "/users/sid"

แน่นอนว่าในคอนโทรลเลอร์ คุณจะต้องค้นหาผู้ใช้ตามชื่อ

class UsersController
  ...
  def show
    @user = User.find_by_name(params[:id])
  end
  ...
end

ฉันขอแนะนำให้คุณดูอัญมณี Friendly_id ด้วย

FriendlyId คือ "รถปราบดินของกองทัพสวิส" ของปลั๊กอินกระสุนและลิงก์ถาวรสำหรับ ActiveRecord ช่วยให้คุณสร้าง URL ที่สวยงามและทำงานกับสตริงที่เป็นมิตรต่อมนุษย์ราวกับว่าเป็นรหัสตัวเลขสำหรับโมเดล ActiveRecord

person cutalion    schedule 08.03.2012
comment
ขอบคุณสำหรับสิ่งนั้นใช้งานได้ดี ตอนนี้ฉันได้ตั้งค่าเป็นพื้นฐานแล้ว แต่จะลองดู Friendly_id gem นี้เพื่อสร้างไซต์ที่เป็นมิตรมากขึ้น ขอบคุณ. - person user1222136; 08.03.2012
comment
และถ้า User#name สามารถมีจุดได้ คุณจะต้องการ :constraints => { :name => /.*/ } บนเส้นทางเพื่อป้องกันไม่ให้ Rails พยายามตีความสิ่งต่าง ๆ หลังจากจุดนั้นเป็นรูปแบบ - person mu is too short; 08.03.2012