Tôi muốn sử dụng gọi lại after_save để đặt cột updated_by thành current_user. Nhưng current_user không có sẵn trong mô hình. Làm thế nào tôi nên làm điều này?after_save gọi lại để đặt cột updated_by thành current_user
6
A
Trả lời
8
Bạn cần xử lý trong bộ điều khiển. Trước tiên, hãy thực hiện lưu trên mô hình, sau đó nếu cập nhật thành công trường bản ghi.
Ví dụ
class MyController < ActionController::Base
def index
if record.save
record.update_attribute :updated_by, current_user.id
end
end
end
Một thay thế (tôi thích cái này) là để tạo ra một phương pháp tùy chỉnh trong mô hình của bạn mà kết thúc tốt đẹp logic. Ví dụ
class Record < ActiveRecord::Base
def save_by(user)
self.updated_by = user.id
self.save
end
end
class MyController < ActionController::Base
def index
...
record.save_by(current_user)
end
end
1
tôi đã thực hiện monkeypatch này dựa trên lời khuyên Simone Carletti, như xa như tôi có thể nói touch
timestamps chỉ thực hiện, không phải là người sử dụng id. Có gì không ổn với điều này? Điều này được thiết kế để làm việc với một thiết lập current_user
.
class ActiveRecord::Base
def save_with_user(user)
self.updated_by_user = user unless user.blank?
save
end
def update_attributes_with_user(attributes, user)
self.updated_by_user = user unless user.blank?
update_attributes(attributes)
end
end
Và sau đó create
và update
phương pháp gọi những như vậy:
@foo.save_with_user(current_user)
@foo.update_attributes_with_user(params[:foo], current_user)
Các vấn đề liên quan
- 1. Gọi lại - after_save nhưng KHÔNG tạo
- 2. Rails after_save gọi lại được gọi nhiều lần
- 3. Rails after_save gọi lại để tạo mô hình liên quan dựa trên column_changed?
- 4. Làm thế nào để bạn đặt một `current_user` với update_attributes được đặt thành false?
- 5. Gọi phương thức lớp học trong một after_save
- 6. Đặt lại một cột Các mức MultiIndex
- 7. Đặt giá trị lặp lại vào cột
- 8. gọi lại để xử lý hoàn thành đường ống
- 9. Android: Gọi lại với thành phần WebView?
- 10. UIView gọi lại hoàn thành hoạt ảnh?
- 11. AutoExposureLock đặt lại sau khi gọi takePicture()
- 12. Rails Devise - current_user là nil
- 13. Backbone model.save() không gọi lỗi hoặc gọi lại thành công
- 14. Giá trị biến cài đặt trong Gọi lại Moq() gọi
- 15. Đặt lại IntelliJ UI thành Mặc định
- 16. NSCursor luôn đặt lại thành Arrow
- 17. highcharts ẩn nút đặt lại thu phóng, gọi zoom đặt lại theo lập trình
- 18. Làm thế nào để phát hiện xem tập tin đính kèm kẹp giấy đã được thay đổi trong cuộc gọi lại after_save chưa?
- 19. Dữ liệu bảng trống và đặt lại các cột IDENTITY
- 20. Có cách nào để xử lý `after_save` và` after_destroy` "bằng nhau"?
- 21. Cách đặt cột hộp văn bản DataGridView thành nhiều dòng?
- 22. Lừa để đặt lại odbc_error()
- 23. Có thể chuyển các cuộc gọi lại thành IEnumerable
- 24. $ gọi lại tài nguyên (lỗi và thành công)
- 25. Đặt đối tượng gọi lại kiểu C theo định hướng?
- 26. Gọi lại thành công jQuery ajax không bắn
- 27. Không thể phát hiện hoàn thành TTS (gọi lại) android.
- 28. Gọi MiniDumpWriteDump với gọi lại
- 29. Android: Gọi lại AsyncTask thành Phân đoạn (Không hoạt động)
- 30. Đặt biến cục bộ trong hàm gọi lại JavaScript
+1 cho phương pháp liên lạc :) – lucapette
Lý do cho đặt nó trong mô hình là nó là khô, vì tiết kiệm () có thể được gọi từ nhiều nơi trong ứng dụng, không chỉ một bộ điều khiển. Tôi chỉ muốn làm điều đó một lần, và không phải lặp lại bản thân của tôi, và lo lắng về việc luôn luôn nhớ để thiết lập này. – pixelearth
Sau đó, tạo một phương thức mới, như Model.save_from_user (người dùng) và đặt ở đó logic để lưu bản ghi và thực hiện thao tác chạm. Sau đó, trong bộ điều khiển của bạn chỉ cần gọi phương thức đó truyền tham số 'current_user' làm đối số. –