lib/jets/overrides/rails/url_helper.rb in jets-1.9.32 vs lib/jets/overrides/rails/url_helper.rb in jets-2.0.0
- old
+ new
@@ -9,17 +9,78 @@
url = case options
when String
options
when :back
_back_url
- # TODO: hook this up to Jets implmentation of config/routes.rb
- # when ActiveRecord::Base
- # record = options
- # record.id
+ when ActiveRecord::Base
+ _handle_model(options)
+ when Array
+ _handle_array(options)
else
- raise ArgumentError, "Please provided a String to link_to as the the second argument. The Jets link_to helper takes as the second argument."
+ raise ArgumentError, "Please provided a String or ActiveRecord model to link_to as the the second argument. The Jets link_to helper takes as the second argument."
end
add_stage_name(url)
end
+
+ def _handle_model(record)
+ model = record.to_model
+ if model.persisted?
+ meth = model.model_name.singular_route_key + "_path"
+ send(meth, record) # Example: post_path(record)
+ else
+ meth = model.model_name.route_key + "_path"
+ send(meth) # Example: posts_path
+ end
+ end
+
+ # Convention is that the model class name is the method name. Doesnt work if user is using as.
+ def _handle_array(array)
+ contains_nil = !array.select(&:nil?).empty?
+ if contains_nil
+ raise "ERROR: You passed a nil value in the Array. #{array.inspect}."
+ end
+
+ last_persisted = nil
+ items = array.map do |x|
+ if x.is_a?(ActiveRecord::Base)
+ last_persisted = x.persisted?
+ x.persisted? ? x.model_name.singular_route_key : x.model_name.route_key
+ else
+ x
+ end
+ end
+ meth = items.join('_') + "_path"
+
+ args = array.clone
+ args.shift if args.first.is_a?(Symbol) # drop the first element if its a symbol
+ args = last_persisted ? args : args[0..-2]
+
+ # post_comment_path(post_id) - keep all args - for update
+ # post_comments_path - drop last arg - for create
+ send(meth, *args)
+ end
+
+ # for forgery protection
+ def token_tag(token = nil, form_options: {})
+ return '' unless protect_against_forgery?
+
+ hidden_field_tag 'authenticity_token', masked_authenticity_token
+ end
+
+ def masked_authenticity_token
+ @masked_authenticity_token ||= SecureRandom.hex(32)
+ session[:authenticity_token] = @masked_authenticity_token
+ end
+
+ def protect_against_forgery?
+ @_jets[:controller].class.forgery_protection_enabled?
+ end
+
+ def csrf_meta_tags
+ if protect_against_forgery?
+ tag("meta", name: "csrf-token", content: masked_authenticity_token).html_safe
+ end
+ end
end # UrlHelper
+
ActionView::Helpers.send(:include, Jets::UrlHelper)