0

我对 Ruby on Rails 还很陌生,我来自 PHP,我意识到这不仅仅是降低语法那么简单,还有很多好的结构实践需要考虑。

虽然我目前的工作有效,但我几乎可以肯定我没有以最好的方式做到这一点。

这就是我正在做的事情。我正在通过 AJAX 跟踪点击并更新数据库中的记录以监控流行的接入点。

这是我的控制器:

class AjaxController < ApplicationController

  def track    
    elem = Tracking.where('element = ?', params[:element]).first
    if elem.nil?
      Tracking.create(:element => params[:element], :count => 0)
    else
      elem.count = elem.count + 1
      elem.save
    end
    render :text => 'ok'
  end

  def validate
    if request.xhr? && respond_to?(params[:callback])
      return self.send(params[:callback])
    end
    no_access
  end

  private

  def no_access
    redirect_to root_url
  end

end

这是我的模型:

class Tracking < ActiveRecord::Base
  attr_accessible :element, :count
end

跟踪表:

+-------------------------+
| id | element    | count |
+-------------------------+
| 1  | bazinga    |   3   |
---------------------------

如果可以重构某些东西,谁能引导我朝着正确的方向前进?

4

3 回答 3

2

我会看到一些关于 Rails 转换的重构。但是,如果您有任何特定原因,这些可以过度滚动。

1 - 您的型号名称(我认为您是对的,请仔细检查表名)

理想情况下,Rails 将使用复数形式的表格和单数形式的模型。所以你的桌子应该是trackings,你的模型应该是Tracking

2 - 控制器

由于您指的是您的跟踪模型,按照惯例,控制器名称应该是TrackingsController

而且 Rails 使用 REST 方法,因此请尽量保留默认的 7 个控制器操作(只要它们在上下文中有意义)。默认 REST 控制器操作是

index

show

new

create

edit

update

destroy

所以我认为你的点击可以匹配为Trackings -> create

并且可能 no_access 方法可以移动到 ApplicationController,因为它可以被任何控制器使用

程序逻辑

通常我们不会在控制器中编写域登录,因此您在控制器中的以下部分

elem = Tracking.where('element = ?', params[:element]).first
if elem.nil?
  Tracking.create(:element => params[:element], :count => 0)
else
  elem.count = elem.count + 1
  elem.save
end

可以移动到模型中

class Tracking < ActiveRecord::Base
  attr_accessible :element, :count

  def self.track(params)
    #your creation and counter update login
  end

end

在你的控制器中

def create
    Tracking.track(params)
    render :text => 'ok'
 end
于 2012-09-09T06:34:47.720 回答
1

您的控制器可以从一些 RESTful 设计中受益。让你的控制器使用资源——AjaxController 不是这样的例子。

通过移动no_accessApplicationController并添加CanCan以进行授权来干燥您的代码。

您的模型很好,但您可能需要验证。并在架构中指定不为空。

最后,继续阅读其他人的代码。并继续编写自己的代码。你会及时好起来的。

于 2012-09-09T06:31:36.303 回答
1

除了sameera207所说的,您可能可以使用find_or_create_方法缩短查找或创建记录的过程:

Tracking.find_or_create_by_element(params[:element])

编辑

您可以使用以下方法处理增加的值:

tracking = Tracking.find_or_create_by_element(params[:element]) do |t|
  t.count = 1
end
tracking.count += 1
tracking.save
于 2012-09-09T17:18:15.947 回答