Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails mysql更新_Ruby On Rails_Ruby_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails Rails mysql更新

Ruby on rails Rails mysql更新,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,我是RubyonRails的新手,我来自PHP,我意识到这不仅仅是简单的语法,还有很多很好的结构实践 虽然我现在做的很有效,但我几乎可以肯定我没有用最好的方式来做 这是我正在做的。我通过AJAX跟踪点击,并更新数据库中的记录,以监控流行的访问点 这是我的控制器: class AjaxController < ApplicationController def track elem = Tracking.where('element = ?', params[:elem

我是RubyonRails的新手,我来自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

如果有什么东西可以重构,有人能给我指引正确的方向吗?

您的控制器可以从RESTful设计中受益。让您的控制器与资源一起工作——AjaxController不是这样的例子

通过将
no_access
移动到
ApplicationController
并添加以获得授权来干燥代码

您的模型很好,不过您可能需要验证。并在模式中指定NOTNULL


最后,继续阅读其他人的代码。继续编写自己的代码。您的控制器可以从一些RESTful设计中受益。让您的控制器与资源一起工作——AjaxController不是这样的例子

通过将
no_access
移动到
ApplicationController
并添加以获得授权来干燥代码

您的模型很好,不过您可能需要验证。并在模式中指定NOTNULL


最后,继续阅读其他人的代码。继续编写自己的代码。而且你会及时变得更好。

我会看到一些关于Rails转换的重新分解。但如果你有任何具体的原因,这些都可能被夸大

1-您的型号名称(我认为您答对了,只需再次检查表名)

理想情况下,Rails的表格为复数形式,模型为单数形式。因此,您的表应该是
跟踪
,您的模型应该是
跟踪

2-控制器

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

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

index

show

new

create

edit

update

destroy
因此,我认为您的点击可以匹配为
Trackings->create

而且可能没有任何访问方法可以移动到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
def create
    Tracking.track(params)
    render :text => 'ok'
 end
可以移动到类似的模型

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

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

end

我会看到一些关于Rails转换的重新分解。但如果你有任何具体的原因,这些都可能被夸大

1-您的型号名称(我认为您答对了,只需再次检查表名)

理想情况下,Rails的表格为复数形式,模型为单数形式。因此,您的表应该是
跟踪
,您的模型应该是
跟踪

2-控制器

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

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

index

show

new

create

edit

update

destroy
因此,我认为您的点击可以匹配为
Trackings->create

而且可能没有任何访问方法可以移动到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
def create
    Tracking.track(params)
    render :text => 'ok'
 end
可以移动到类似的模型

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

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

end

除了sameera207所说的之外,您还可以使用
find\u或\u create\u
方法缩短查找或创建记录的过程:

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

除了sameera207所说的之外,您还可以使用
find\u或\u create\u
方法缩短查找或创建记录的过程:

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

我读到了,问题是如果它存在,我会增加计数。我读到了,问题是如果它存在,我会增加计数。