module Recaptcha::ClientHelper

Public Instance Methods

recaptcha_tags(options = {}) click to toggle source

Your public API can be specified in the options hash or preferably using the Configuration.

# File lib/recaptcha/client_helper.rb, line 5
def recaptcha_tags(options = {})
  if options.key?(:stoken)
    raise(RecaptchaError, "Secure Token is deprecated. Please remove 'stoken' from your calls to recaptcha_tags.")
  end
  if options.key?(:ssl)
    raise(RecaptchaError, "SSL is now always true. Please remove 'ssl' from your calls to recaptcha_tags.")
  end

  public_key = options[:public_key] || Recaptcha.configuration.public_key!

  script_url = Recaptcha.configuration.api_server_url
  script_url += "?hl=#{options[:hl]}" unless options[:hl].to_s == ""
  fallback_uri = "#{script_url.chomp('.js')}/fallback?k=#{public_key}"

  data_attributes = [:theme, :type, :callback, :expired_callback, :size]
  data_attributes = options.each_with_object({}) do |(k, v), a|
    a[k] = v if data_attributes.include?(k)
  end
  data_attributes[:sitekey] = public_key
  tag_attributes = data_attributes.map { |k, v| %Q(data-#{k.to_s.tr('_', '-')}="#{v}") }.join(" ")

  if id = options[:id]
    tag_attributes << %Q( id="#{id}")
  end

  html = ""
  html << %Q(<script src="#{script_url}" async defer></script>\n) if options.fetch(:script, true)
  html << %Q(<div class="g-recaptcha" #{tag_attributes}></div>\n)

  if options[:noscript] != false
    html << <<-HTML
      <noscript>
        <div>
          <div style="width: 302px; height: 422px; position: relative;">
            <div style="width: 302px; height: 422px; position: absolute;">
              <iframe
                src="#{fallback_uri}"
                frameborder="0" scrolling="no"
                style="width: 302px; height:422px; border-style: none;">
              </iframe>
            </div>
          </div>
          <div style="width: 300px; height: 60px; border-style: none;
            bottom: 12px; left: 25px; margin: 0px; padding: 0px; right: 25px;
            background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;">
            <textarea id="g-recaptcha-response" name="g-recaptcha-response"
              class="g-recaptcha-response"
              style="width: 250px; height: 40px; border: 1px solid #c1c1c1;
              margin: 10px 25px; padding: 0px; resize: none;" value="">
            </textarea>
          </div>
        </div>
      </noscript>
    HTML
  end

  html.respond_to?(:html_safe) ? html.html_safe : html
end