Rails 3 - 如何通过link_to增加值和更新数据库

Kat*_*e M 1 ruby-on-rails-3

我有一个观点:

<h2>The current billing period is <%= @current_period %></h2>
<h2>The current period approved is <%= @approval_period %></h2>
<h2><%= link_to "Approve Period", :method => :approve, :id => @approval_period %></h2>
Run Code Online (Sandbox Code Playgroud)

和一个控制器:

def approval_period
  @current_period = PeriodCounter.first.period.pe_number
  @approval_period = ApprovalPeriod.first.period.pe_number
end

def approve
  @approval_period = ApprovalPeriod.first.period_id
  @approval_period.update_attribute("period_id", period_id + 1)
  @approval_period.save
  redirect_to :back
  flash[:notice] = "Approval Period Updated."
end
Run Code Online (Sandbox Code Playgroud)

我正在尝试更新数据库,以便在点击链接时将@approval_period增加1.我已经离开Rails很长一段时间了,所以我知道我错过了一些关键元素.有帮助吗?提前致谢...

Sye*_*lam 8

:method不是控制器中的方法,而是HTTP动词,如Get或Post.相反,你应该做的事情

<%= link_to "Approve Period", approve_path(:period => @approval_period) %>
Run Code Online (Sandbox Code Playgroud)

并在routes.rb中添加approve_path为

match "/approve" => "controller#approve", :as => :approve
Run Code Online (Sandbox Code Playgroud)

(以上是添加路线的一种方法,您可以学习如何添加更多的宁静路线)

从Outside In读取Rails路由以了解有关路由的更多信息.

更新:

@approval_period.update_attribute("period_id", period_id + 1)
Run Code Online (Sandbox Code Playgroud)

上面的行是抛出错误的原因.你没有period_id在任何地方定义.来的参数是params[:period].

然后,你可以这样做:

方法1

@approval_period = ApprovalPeriod.find(params[:period]) 
@approval_period.update_attribute("period_id", @approval.period_id + 1)
Run Code Online (Sandbox Code Playgroud)

方法2

在一个方法中抽象出来:

class ApprovalPeriod < AR::Base
  def increment!
    # Here 'period_id' is valid since it is an attribute and a method 
    # with that name will be available
    update_attribute(:period_id, period_id + 1)
  end
end
Run Code Online (Sandbox Code Playgroud)

在控制器中:

def approve
  @approval_period = ApprovalPeriod.find(params[:period])
  @approval_period.increment!
  ...
  # Other code here
end
Run Code Online (Sandbox Code Playgroud)

随身携带任何套房.