Advertisement
Guest User

Untitled

a guest
Apr 24th, 2016
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.53 KB | None | 0 0
  1. - mình có 2 controllers khác nhau: users_controller và contact_details_controller
  2. - nhưng trong views/users/edit mình muốn thêm vào form new của contact_details thì hướng giải quyết ra sao nhỉ?
  3. - mình có tham khảo một số cách làm thì dùng form_tag url_for đến controllers và action name của contact_details_controller
  4. - nhưng hiện tại thì mình đã implement các action name cho mỗi controller xong hết rồi
  5. - sample code của mình:
  6. ```
  7. class UserController < UserDashboardController
  8. include Devise::Controllers::Helpers
  9. include ContactDetailHelper
  10. before_action :authorize_resource
  11. after_action :verify_authorized, except: :index
  12. helper DeviseHelper
  13. def update
  14. prev_unconfirmed_email = @user.unconfirmed_email if @user.respond_to?(:unconfirmed_email)
  15. if @user.update_with_password(updated_params)
  16. message = update_needs_confirmation?(@user, prev_unconfirmed_email) ? I18n.t('devise.registrations.update_needs_confirmation') : I18n.t('devise.registrations.updated')
  17. flash[:notice] = message
  18. sign_in :user, @user, bypass: true
  19. redirect_to user_path
  20. else
  21. message = require_current_password? ? I18n.t('devise.passwords.need_current_password') : I18n.t('devise.failure.update_failed')
  22. flash[:error] = message
  23. clean_up_passwords @user
  24. render :edit
  25. end
  26. end
  27. def my_account
  28. end
  29. protected
  30. def require_current_password?
  31. # Set new password or update new email
  32. !secure_params[:password].blank? || (!secure_params[:email].blank? && secure_params[:email] != @user.email)
  33. end
  34. def update_needs_confirmation?(resource, previous)
  35. resource.respond_to?(:pending_reconfirmation?) &&
  36. resource.pending_reconfirmation? &&
  37. previous != resource.unconfirmed_email
  38. end
  39. def authorize_resource
  40. @user = current_user
  41. authorize @user
  42. end
  43. def clean_up_passwords(object)
  44. object.clean_up_passwords if object.respond_to?(:clean_up_passwords)
  45. end
  46. private
  47. def secure_params
  48. params.require(:user).permit(:first_name, :last_name, :password, :current_password)
  49. end
  50. def updated_params
  51. params.require(:user).permit(:password, :current_password)
  52. end
  53. end
  54. ```
  55. ```
  56. class ContactDetailController < UserDashboardController
  57. before_action :load_parent_and_build_objects
  58. after_action :verify_authorized, except: :index
  59. def new
  60. end
  61. def edit
  62. end
  63. def create
  64. @contact_detail.attributes = secure_params
  65. if @contact_detail.save
  66. flash.notice = I18n.t('messages.creating_successful', object_name: I18n.t('contact_detail', scope: 'activerecord.models'))
  67. redirect_to after_create_contact_detail_link
  68. else
  69. render :new
  70. end
  71. end
  72. def update
  73. if @contact_detail.update_attributes(secure_params)
  74. flash.notice = flash.notice = I18n.t('messages.updating_successful', object_name: I18n.t('contact_detail', scope: 'activerecord.models'))
  75. redirect_to smart_parent_contact_detail_link(:edit, @parent_object)
  76. else
  77. render :edit
  78. end
  79. end
  80. protected
  81. def load_parent_and_build_objects
  82. @user = current_user
  83. contactable_type = params[:contactable_type]
  84. @parent_object ||= case contactable_type
  85. when 'corporate_investor'
  86. @user.corporate_investor
  87. else
  88. @user
  89. end
  90. if ['new', 'create'].include?(params[:action])
  91. @contact_detail = @parent_object.contact_detail
  92. if @contact_detail.present? && @contact_detail.persisted?
  93. redirect_to smart_parent_contact_detail_link(:edit, @parent_object)
  94. else
  95. authorize @parent_object, :create_contact_detail?
  96. @contact_detail = @parent_object.build_contact_detail
  97. end
  98. else
  99. authorize @parent_object, :contact_detail?
  100. @contact_detail = @parent_object.contact_detail
  101. end
  102. end
  103. def after_create_contact_detail_link
  104. parent_object = @contact_detail.contactable
  105. if parent_object.is_a?(CorporateInvestor)
  106. new_corporate_investor_bank_account_path(parent_object)
  107. else
  108. smart_parent_contact_detail_link(:edit, parent_object)
  109. end
  110. end
  111. def smart_parent_contact_detail_link(action, parent_object)
  112. route_name = "#{action}_#{parent_object.model_name.singular_route_key}_contact_detail_path"
  113. send_params = []
  114. send_params << parent_object unless parent_object.is_a?(User)
  115. send(route_name, *send_params)
  116. end
  117. private
  118. def secure_params
  119. params.require(:contact_detail).permit(policy(@parent_object).permitted_contact_detail_attribute)
  120. end
  121. end
  122. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement