I’m creating article teasers for my blogs main page and I am simple adding in my post.rb file the following…
class Post < ActiveRecord::Base
has_many :comments
Before the form is saved we update the time to be more accurate
and format post_text to post_html using RedCloth/textile
***No need to add text to post_html field in the form, this happens automatically
def before_save
self.created_at = Time.now
self.author_name
= ‘Nevyn’ if self.author_name.nil? or self.author_name.empty?
self.post_html = RedCloth.new(self.post_text).to_html
end
def teaser
#return article teaser first paragraph
teaser = self.post_html.slice(0, (self.post_html =~ /\r?</p>\r?$/)).rstrip
return teaser
end
end
my db schema has a ‘post_text’ and ‘post_html’ column, you can see above how I am using RedCloth.
But I am wondering since I am new to Ruby, if there is a cleaner way to do this.
Thanks,
Michael Steinfeld wrote:
I'm creating article teasers for my blogs main page and I am simple adding
in my post.rb file the following..
class Post < ActiveRecord::Base
has_many :comments
# Before the form is saved we update the time to be more accurate
# and format post_text to post_html using RedCloth/textile
# ***No need to add text to post_html field in the form, this happens
automatically
def before_save
self.created_at = Time.now
self.author_name = 'Nevyn' if self.author_name.nil? or
self.author_name.empty?
self.post_html = RedCloth.new(self.post_text).to_html
end
def teaser
#return article teaser first paragraph
teaser = self.post_html.slice(0, (self.post_html =~
/\r?<\/p>\r?$/)).rstrip
return teaser
end
end
my db schema has a 'post_text' and 'post_html' column, you can see above how
I am using RedCloth.
But I am wondering since I am new to Ruby, if there is a cleaner way to do
this.
A few comments:
* You don't need the line to set the created_at time - Rails does this
automatically.
* You can use: if self.author_name.blank? - nil.blank? is true, and so
is "".blank? and " ".blank?
* Instead of self.post_html.slice(0, regex-match-value), do
self.post_html.slice(0..regex-match-value). This way if the regular
expression is not matched and returns -1, you'll get the whole content
of the post instead of nil.
* Instead of doing teaser = ...; return teaser, you can just have the
slice method:
def teaser
self.post_html.slice(0,whatever)
end
Hope this helps,
Dan Manges
Michael Steinfeld wrote:
I’m creating article teasers for my blogs main page and I am simple adding
in my post.rb file the following…
class Post < ActiveRecord::Base
has_many :comments
Before the form is saved we update the time to be more accurate
and format post_text to post_html using RedCloth/textile
***No need to add text to post_html field in the form, this happens
automatically
def before_save
self.created_at = Time.now
self.author_name = ‘Nevyn’ if self.author_name.nil? or
self.author_name.empty?
self.post_html
= RedCloth.new(self.post_text).to_html
end
def teaser
#return article teaser first paragraph
teaser = self.post_html.slice(0, (self.post_html =~
/\r?</p>\r?$/)).rstrip
return teaser
end
end
my db schema has a ‘post_text’ and ‘post_html’ column, you can see above how
I am using RedCloth.
But I am wondering since I am new to Ruby, if there is a cleaner way to do
this.
A few comments:
- You don’t need the line to set the created_at time - Rails does this
automatically.
Well, the reason I am using that is if it takes me 10 minutes to write the article, I don’t get the time since I clicked “Create New Post” I get the time that the post was actually submitted.
Guess that really Isn’t a big deal.
- You can use: if self.author_name.blank?
- nil.blank? is true, and so
is “”.blank? and " ".blank?
- Instead of self.post_html.slice(0, regex-match-value), do
self.post_html.slice(0…regex-match-value). This way if the regular
expression is not matched and returns -1, you’ll get the whole content
of the post instead of nil.
Thanks for the tip! I should hope that it will always be matched, I mean if a post is created self.post_html should have at at least one set of
elements.
- Instead of doing teaser = …; return teaser, you can just have the
slice method:
def teaser
self.post_html.slice(0,whatever)
end
Yeah the return teaser part comes from my python background 
And yes it was a help, Thank you!