2008-12-21 37 views
8

Làm thế nào để tôi có phương pháp to_param để phân phối từ khóa sên tất cả các thời gian? Tôi gặp khó khăn khi nhận được nó để làm việc với các tuyến đường này:Ghi đè Rails to_param?

map.pike '/ đấu giá /: auction_id/item /: id',: controller => 'mục',: action => 'show'

trước đó to_param ghi đè được làm việc cho

'mục/1-cashmere-khăn'

nhưng không thành công với 'auction/123/item/1'

cập nhật:

tôi không chắc chắn nếu cú ​​pháp là chính xác [(chỉnh sửa: nó đúng: nó hoạt động :-)], hoặc thậm chí hiệu quả .... nhưng bằng cách sử dụng haml, tôi thấy rằng đoạn mã sau hoạt động để tạo ra liên kết mong muốn ('đấu giá /: auction_id/item /: id ')

- for auction in @auctions.sort{|a, b| a.scheduled_start <=> b.scheduled_start} 
    -for item in @items 
    - unless auction.current_auction 
     ... pike_path(auction.auction_id, item) 

Trả lời

8

Tôi không chắc liệu tôi có hiểu câu hỏi của bạn hay không. (Đó là 3:41 AM ở đây)

Từ những gì tôi thấy, bạn truy cập trực tiếp phương thức auction_id, thay vì sử dụng pike_path(auction, item) để sử dụng #to_param.

Ngoài ra, nó có thể không thành công cho auction/123/item/1 vì bạn chưa thay đổi bộ điều khiển của mình.

Tôi nghĩ sẽ hữu ích khi mô tả cách làm việc sên.

Nói chung, nếu bạn ghi đè #to_param, ID không còn hoạt động. Nó có nghĩa là, nếu bạn đi với sên, mỗi khi polymorpic URL được tạo ra (ví dụ, link_to object, object), nó chuyển giá trị của to_param. Điều đáng chú ý là bạn cũng phải thay đổi bộ điều khiển của mình.

Cá nhân tôi nghĩ rằng cách tốt nhất để tạo ra sên dễ dàng là sử dụng permalink_fu của techno-weenie, thêm has_permalink vào mẫu của bạn và sau đó ghi đè to_param. Ví dụ:

class Auction < ActiveRecord::Base 
    has_permalink :title, :slug 
end 

giả sử bạn có sên, trường chuỗi và muốn slugize tiêu đề của bạn.

Bạn cũng cần phải điều chỉnh điều khiển của bạn:

class AuctionsController < ApplicationController 
    def show 
    @auction = Auction.find_by_slug(params[:id]) || raise(ActiveRecord::RecordNotFound) 

    respond_to do |format| 
     format.html # show.html.erb 
    end 
end 

Sau đó, bạn có thể tạo các tuyến đường, trong các quan điểm, theo cách này:

link_to @action, @action 

Bằng cách này, bạn không nên sắp xếp hành động của bạn Theo quan điểm. Cách tốt nhất là sử dụng named_scope.

+3

bạn có thể sử dụng 'find_by_slug! 'Để tăng ngoại trừ trừ khi tìm thấy –