一千萬個為什麽

搜索

保存帖子,然後發推文

這是我的控制器的一部分,它變得非常冗長(代碼工作)。 這段代碼會降低我網站的性能嗎?可以清理並更有效地書寫嗎? def create @post = current_user.posts.build(params[:post])

if @post.save if @post.verify UserMailer.verifyemail(@user).deliver redirectto root_path else flash[:success] = "Posted"

  if @post.content.to_s.length > 140 and @post.image.present?
    @twitter = Twitter::Client.new
    @twitter.update(@post.content.truncate(120)+"... " [email protected]_s)
    redirect_to root_path
  elsif @post.content.to_s.length > 140
    @twitter = Twitter::Client.new
    @twitter.update(@post.content.truncate(140))
    redirect_to root_path
  elsif @post.content.to_s.length <= 140 and @post.image.present?
    @twitter = Twitter::Client.new
    @twitter.update(@post.content.truncate(120)+""[email protected]_s)
    redirect_to root_path
  else @post.content.to_s.length <= 140
    @twitter = Twitter::Client.new
    @twitter.update(@post.content)
    redirect_to root_path
  end
end

else @feeditems = [] render 'staticpages/home' end end

最佳答案

大致: twitter = Twitter::Client.new

img, max = @post.image ? [@post.image.path.to_s, 120] : ["", 140] twitter.update("#{@post.content.truncate(max)}#{img}")

redirectto rootpath

所有Twitter的東西都不應該在控制器中,而應該在實用程序類中。這使得測試更容易,使實現中的插入更容易,使擴展更容易,等等。 此外,如果需要截斷, truncate 應該已經添加了“...”。 就個人而言,我更喜歡阿米特的回答。 IMO它比我的更容易閱讀和更明顯。 在初步審查後,我可能會收緊一下這樣的事情: s = @post.image ? "#{@post.content.truncate(120)}... #{@post.image.path.to_s}" : @post.content.truncate(140) twitter.update(s)

它的格式是突出顯示兩者之間的相似性,另一種選擇是再次使用字符串插值,但在這種特殊情況下似乎是多余的。 (顯然字符串創建將在某種支持裝飾器等方法中進入。) 上述所有內容均未經測試,但可能已接近。

轉載註明原文: 保存帖子,然後發推文