2011-10-10 18 views
12

Tôi phải kết nối với cơ sở dữ liệu hiện có được máy chủ freeradius của chúng tôi sử dụng. Một bảng có một cột được gọi là thuộc tính mà tôi đang cố truy cập.ActiveRecord :: DangerousAttributeError

Khi truy cập vào, tôi nhận được lỗi của mình:

ActiveRecord::DangerousAttributeError 
attribute? is defined by ActiveRecord 

Tôi đã cố gắng để lựa chọn và đổi tên cột này trong mô hình của tôi:

def self.default_scope 
    Radcheck.select("attribute as newattribute") 
end 

Nhưng điều đó không làm việc một trong hai.

Có ai có thể giới thiệu cách này không? Tôi thực sự muốn đổi tên cột trong đường ray!

Trả lời

2

Tôi chưa bao giờ gặp phải tình huống như vậy, nhưng tôi nghĩ rằng điều này sẽ làm việc

class Radcheck < ActiveRecord::Base 
    default_scope :select=> 'attribute as newattribute' 
end 

Bạn nên sử dụng ví dụ phương pháp default_scope không lớp một

Ngoài ra bạn có một tùy chọn để sử dụng phương pháp dụ, như:

RadCheck.read_attribute :attribute 

Hy vọng nó giúp

+0

Cảm ơn - Tôi đã thử này và tôi vẫn nhận được lỗi thổi .Tôi có cần phải thay đổi hành động điều khiển của mình không? Hiện tại tôi có điều này: @radcheck = Radcheck.all Cảm ơn –

+0

Đã không hoạt động trong AR4 –

10

Trên si câu hỏi milar Tôi tìm thấy câu trả lời này: https://stackoverflow.com/a/9106597/1266906

Mà không cần phải quan tâm về những thuộc tính đều được bảo vệ bởi ActiveRecord trong Rails 3.0 chỉ cần thêm

gem 'safe_attributes' 

để Gemfile của bạn và đá quý sẽ cố gắng chăm sóc tất cả các tên va chạm tự động.

Giống như câu trả lời khác bạn cần sử dụng Radcheck[:attribute] hoặc Radcheck.read_attribute :attribute/Radcheck.write_attribute :attribute, 'value' để truy cập các trường có tên được đặt trước, nhưng đá quý đảm bảo các xác thực như validates_presence_of :attribute sẽ hoạt động như bình thường.

Thông tin chi tiết được cung cấp tại https://github.com/bjones/safe_attributes

+1

Tôi đã gặp vấn đề tương tự với thuộc tính hợp lệ trong cơ sở dữ liệu cũ của tôi. Sử dụng "safe_attributes" đã làm việc ra khỏi hộp. – dhenze

+2

Chỉ cần một lưu ý cho nhân viên của Google: Đá quý này sẽ hoạt động với khá nhiều từ dành riêng * ngoại trừ * đối với 'thuộc tính'. Từ readme: "Hầu như không thể có một cột có tên là 'thuộc tính' trong lược đồ của bạn khi sử dụng ActiveRecord." –

+0

Nếu sử dụng Hirb, bạn có thể cần vô hiệu hóa trước khi cố gắng hiển thị các cột mô hình trong bảng điều khiển, với Hirb.disable. –

0

Dưới đây là một giải pháp mà không đòi hỏi một sự thay đổi cơ sở dữ liệu bên ngoài, nhưng nó là một sự thay đổi rất nhỏ, và nó sẽ làm việc với bất kỳ tên cột thậm chí 'attribute`. Không cần đá quý.

Trong cơ sở dữ liệu bên ngoài/cũ của bạn, hãy tạo chế độ xem đổi tên cột có vấn đề. ví dụ.

Cột này đang được đổi tên thành attribute thành rad_attribute.

Đừng quên cấp quyền thích hợp trên chế độ xem. Trong trường hợp của tôi nó là chỉ đọc sử dụng:

GRANT SHOW VIEW ON radius.radcheck_view TO <rails_user> IDENTIFIED BY '<password>'; 

Sau đó, trong mô hình đường ray của bạn sử dụng xem như table_name

class RadiusRadcheck < RadiusExternal 
    self.table_name = 'radcheck_view' 
end