Skip to content

Instantly share code, notes, and snippets.

@Odaeus
Created March 12, 2013 15:40
Show Gist options
  • Save Odaeus/5143962 to your computer and use it in GitHub Desktop.
Save Odaeus/5143962 to your computer and use it in GitHub Desktop.
Discourse craziness
44) User previous_visit_at first time another call right after still has no value
Failure/Error: let(:user) { Fabricate(:user) }
NoMethodError:
undefined method `first' for nil:NilClass
# ./lib/pretty_text.rb:122:in `block in markdown'
# <internal:prelude>:10:in `synchronize'
# ./lib/pretty_text.rb:119:in `markdown'
# ./lib/pretty_text.rb:175:in `cook'
# ./app/models/user.rb:424:in `cook'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/callbacks.rb:429:in `_run__4302418198468556500__save__3765986560144774874__callbacks'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/callbacks.rb:405:in `__run_callback'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/callbacks.rb:385:in `_run_save_callbacks'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/activesupport-3.2.12/lib/active_support/callbacks.rb:81:in `run_callbacks'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/callbacks.rb:264:in `create_or_update'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/persistence.rb:104:in `save!'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/validations.rb:56:in `save!'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/attribute_methods/dirty.rb:33:in `save!'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/transactions.rb:264:in `block in save!'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/transactions.rb:208:in `transaction'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/transactions.rb:311:in `with_transaction_returning_status'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/activerecord-3.2.12/lib/active_record/transactions.rb:264:in `save!'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/fabrication-2.5.4/lib/fabrication/generator/base.rb:83:in `persist'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/fabrication-2.5.4/lib/fabrication/generator/base.rb:27:in `create'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/fabrication-2.5.4/lib/fabrication/schematic/definition.rb:62:in `block in fabricate'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/fabrication-2.5.4/lib/fabrication/schematic/definition.rb:61:in `instance_eval'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/fabrication-2.5.4/lib/fabrication/schematic/definition.rb:61:in `fabricate'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/fabrication-2.5.4/lib/fabrication/fabricator.rb:10:in `fabricate'
# /home/andrew/.rbenv/versions/1.9.3-p362/lib/ruby/gems/1.9.1/gems/fabrication-2.5.4/lib/fabrication.rb:51:in `Fabricate'
def self.v8
return @ctx unless @ctx.nil?
@ctx = V8::Context.new
@ctx["helpers"] = Helpers.new
@ctx.load(app_root + "app/assets/javascripts/external/Markdown.Converter.js")
@ctx.load(app_root + "app/assets/javascripts/external/twitter-text-1.5.0.js")
@ctx.load(app_root + "lib/headless-ember.js")
@ctx.load(app_root + "app/assets/javascripts/external/rsvp.js")
@ctx.load(Rails.configuration.ember.handlebars_location)
#@ctx.load(Rails.configuration.ember.ember_location)
@ctx.load(app_root + "app/assets/javascripts/external/sugar-1.3.5.js")
@ctx.eval("var Discourse = {}; Discourse.SiteSettings = #{SiteSetting.client_settings_json};")
@ctx.eval("var window = {}; window.devicePixelRatio = 2;") # hack to make code think stuff is retina
@ctx.load(app_root + "app/assets/javascripts/discourse/components/bbcode.js")
@ctx.load(app_root + "app/assets/javascripts/discourse/components/utilities.js")
@ctx.load(app_root + "app/assets/javascripts/discourse/components/markdown.js")
# Load server side javascripts
if DiscoursePluginRegistry.server_side_javascripts.present?
DiscoursePluginRegistry.server_side_javascripts.each do |ssjs|
@ctx.load(ssjs)
end
end
@ctx['quoteTemplate'] = File.open(app_root + 'app/assets/javascripts/discourse/templates/quote.js.shbrs') {|f| f.read}
@ctx['quoteEmailTemplate'] = File.open(app_root + 'lib/assets/quote_email.js.shbrs') {|f| f.read}
@ctx.eval("HANDLEBARS_TEMPLATES = {
'quote': Handlebars.compile(quoteTemplate),
'quote_email': Handlebars.compile(quoteEmailTemplate),
};")
@ctx
end
def self.markdown(text, opts=nil)
# we use the exact same markdown converter as the client
# TODO: use the same extensions on both client and server (in particular the template for mentions)
baked = nil
@mutex.synchronize do
# we need to do this to work in a multi site environment, many sites, many settings
v8.eval("Discourse.SiteSettings = #{SiteSetting.client_settings_json};")
v8.eval("Discourse.BaseUrl = 'http://#{RailsMultisite::ConnectionManagement.current_hostname}';")
v8['opts'] = opts || {}
v8['raw'] = text
v8.eval('opts["mentionLookup"] = function(u){return helpers.is_username_valid(u);}')
v8.eval('opts["lookupAvatar"] = function(p){return Discourse.Utilities.avatarImg({username: p, size: "tiny", avatarTemplate: helpers.avatar_template(p)});}')
baked = v8.eval('Discourse.Markdown.markdownConverter(opts).makeHtml(raw)')
end
# we need some minimal server side stuff, apply CDN and TODO filter disallowed markup
baked = apply_cdn(baked, Rails.configuration.action_controller.asset_host)
baked
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment