2011-12-17 35 views

Trả lời

19

Hãy thử một cái gì đó như thế này:

before_save { |m| if m.url_changed? ... } 

Xem thêm các tài liệu trên ActiveModel::Dirty

+0

Cảm ơn bạn đã thay đổi quyết định và khôi phục câu trả lời của mình, đây là phương pháp phù hợp. Đặc biệt, các phương thức 'url_changed?', 'Url_was' và' url_change' được quan tâm. –

+0

Tôi đã sử dụng paper_trail để thực hiện việc này. – Jacob

0

Nếu nó đã thay đổi, nó phải ở dạng băm params. Nếu nó không thay đổi thì không nên ở đó. Vì vậy, bạn có thể đặt xử lý tùy chỉnh này vào bộ điều khiển hoặc trong một phương thức trên mô hình thực hiện điều này.

Nếu bạn thực sự muốn truy cập nó trong before_save kiểm tra tài liệu về cuộc gọi lại ActiveRecord và bạn sẽ thấy cách truy cập các giá trị trước và sau.

+0

Không, việc này không thuộc trong bộ điều khiển, mô hình phải có trách nhiệm quản lý internals riêng của mình. Và điều gì sẽ xảy ra nếu 'url' được sửa đổi như là một tác dụng phụ của việc thiết lập một thuộc tính khác? Có lẽ một hook 'before_validation' nhìn vào một số thuộc tính khác và cập nhật' url', đó không phải là công việc của bộ điều khiển. Hoặc có lẽ 'before_save' đang được sử dụng để theo dõi lịch sử sửa đổi của mô hình, đó cũng không phải là công việc của bộ điều khiển. –

+0

Đã hiểu. Tôi chỉ cung cấp nhiều cách tiếp cận, bao gồm cả phương pháp sử dụng 'before_save'. Người hỏi ban đầu đã không thực sự đi vào những gì họ muốn làm dựa trên giá trị của url (ví dụ:chuyển hướng ở một nơi khác - một cái gì đó được thực hiện trong bộ điều khiển), vì vậy tôi không muốn giả định mục đích là gì. Tôi chỉ đang chỉ ra những nơi khác nhau mà bạn có thể nhận được thông tin này. – jefflunt

0

tôi đã cố gắng điều này, nhưng nó đã không làm việc ra

#Non-working code 
before_save: record_old_value 
after_save: record_change 

def record_old_value 
    @old_value = self.field 
end 

def record_change 
    if @old_value==self.field 
     create_record_in_history :old_value => @old_value, :new_value => self.field 
    end 
end 

Lý do nó đã không làm việc là bởi vì chúng tôi đặt self.field = new_value vì vậy trong before_save nó không thể truy cập được. Nhưng đường ray có một số chức năng Active-record hơn như field_changed có thể được sử dụng trực tiếp trong cả before_save và after_save. Vì vậy, tôi đã kết thúc với giải pháp này

#working code 
after_save :run_function 
def run_function 
    @old_value = field_was 
    if @old_value==self.field 
     create_record_in_history :old_value => @old_value, :new_value => self.field 
    end 
end 
1
  • tốt hơn theo cách

before :todo, if: :first_name_or_last_name_changed?

  • todo phương pháp của bạn

def first_name_or_last_name_changed?
      first_name_changed? || last_name_changed?
cuối

+0

Bạn có thể [sửa] định dạng lại dưới dạng một khối mã (Ctrl-K hoặc bốn dấu cách hàng đầu) để điều này dễ đọc hơn không? Hãy chắc chắn kiểm tra bản xem trước bên dưới hộp chỉnh sửa. –

+0

thế nào? thanks @NathanTuggy – jamesdelacruz

+0

Tôi nghĩ rằng đây có lẽ là những gì bạn đang tìm kiếm. –

Các vấn đề liên quan