2012-05-27 29 views
55

Trang chỉ mục Tài khoản của tôi liệt kê tất cả các tài khoản và mỗi tài khoản có liên kết đến "+ Dịch vụ"; điều này sẽ hướng người dùng đến/my_services/trang mới và đã điền trước trường account_id với ID thích hợp, tùy thuộc vào liên kết nào được nhấp trên trang Chỉ mục tài khoản.Đường ray - thông số truyền trong link_to

Tôi đã gỡ lỗi (params) ở cuối mỗi trang và với những gì tôi đang cố gắng, tôi không nhận được bất kỳ điều gì ngoài: điều khiển và: hành động hiển thị trong thông số của tôi cho/my_services/trang mới .

Các liên kết Tôi đã cố gắng là thế này:

link_to "+ Service", "my_services/new", :account_id => acct.id 

sau đó tôi cũng có logic trong điều khiển các dịch vụ:

def new 
    @my_service = MyService.new 
    if params[:account_id] 
    @my_service.account_id = params[:account_id] 
    end 
end 

Ai đó có thể giúp đỡ một cách thích hợp để làm điều này? Tôi vẫn chưa thể làm được điều đó với một vài điều khó hiểu mà tôi đã thử.

EDIT

Hóa ra, nếu có ai đó đang nhìn vào câu trả lời này trong tương lai, tài nguyên lồng nhau (có thể với shallow: true tùy chọn trong routes.rb) dường như là con đường để đi. routes.rb của tôi cho phần này ngay bây giờ trông như thế này:

resources :accounts, shallow: true do 
    resources :services 
end 

liên kết của tôi bây giờ trông như thế này:

<%= link_to "+ Service", new_service_path(:service => { :account_id => @account.id }) %> 

Trả lời

85

Trước hết, link_to là một thẻ html helper, số thứ hai của nó là url, tiếp theo là html_options. Những gì bạn muốn là chuyển account_id dưới dạng tham số url vào đường dẫn. Nếu bạn đã thiết lập các tuyến đường được đặt tên chính xác trong routes.rb, bạn có thể sử dụng đường dẫn trợ giúp.

link_to "+ Service", new_my_service_path(:account_id => acct.id) 

Tôi nghĩ rằng cách tốt nhất là phải vượt qua các giá trị mô hình như một param lồng bên trong:

link_to "+ Service", new_my_service_path(:my_service => { :account_id => acct.id }) 

# my_services_controller.rb 
def new 
    @my_service = MyService.new(params[:my_service]) 
end 

Và bạn cần phải kiểm soát ACCOUNT_ID được phép cho 'phân khối. Trong đường ray 3, bạn có thể sử dụng các điều khiển mạnh để lọc các tham số hợp lệ trong bộ điều khiển nơi nó thuộc về. Tôi rất khuyên bạn nên.

http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods

Cũng lưu ý rằng nếu ACCOUNT_ID không tự do được thiết lập bởi người sử dụng (ví dụ, người dùng có thể chỉ nộp một dịch vụ cho ACCOUNT_ID đơn riêng, sau đó nó là thực hành tốt hơn không gửi nó qua các yêu cầu, nhưng đặt nó trong bộ điều khiển bằng cách thêm một cái gì đó như:

@my_service.account_id = current_user.account_id 

bạn chắc chắn có thể kết hợp hai nếu bạn chỉ cho phép người dùng tạo các dịch vụ trên tài khoản riêng của họ, nhưng cho phép quản trị viên để tạo ra bất cứ ai là bằng cách sử dụng vai trò trong attr_accessible.

hy vọng điều này giúp

+0

tôi tự hỏi nếu điều này sẽ làm việc link_to "Dịch vụ", "? My_services/mới ACCOUNT_ID =" + acct.id –

1
link_to "+ Service", controller_action_path(:account_id => acct.id) 

Nếu nó vẫn không làm việc kiểm tra đường dẫn:

$ rake routes 
Các vấn đề liên quan