Rails 3 - Как увеличить значение и обновить БД через link_to - PullRequest
1 голос
/ 14 февраля 2012

У меня есть вид:

<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>

и контроллер:

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

Я пытаюсь обновить базу данных, увеличивая @approval_period на 1 при нажатии на ссылку. Я давно отсутствовал в Rails, поэтому я знаю, что мне не хватает некоторых ключевых элементов. Любая помощь? Заранее спасибо ...

Ответы [ 2 ]

8 голосов
/ 14 февраля 2012

:method это не метод в вашем контроллере, а HTTP-глагол типа Get или Post. Вместо этого вы должны делать что-то вроде

<%= link_to "Approve Period", approve_path(:period => @approval_period) %>

и добавление Approve_path в Routes.rb как

match "/approve" => "controller#approve", :as => :approve

(Выше приведен один из способов добавления маршрута, вы можете узнать, как добавить более спокойные маршруты )

Прочитайте Маршрутизация с внешней стороны , чтобы узнать больше о маршрутизации.

Обновление:

@approval_period.update_attribute("period_id", period_id + 1)

Строка выше - это то, что выдает ошибку. Вы нигде не определили period_id. Параметр, который приходит в params[:period].

Затем вы можете сделать это:

Подход 1

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

Подход 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

А в контроллере:

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

Иди со всем, что тебе подходит.

0 голосов
/ 14 февраля 2012

Попробуйте что-то вроде этого.

Добавьте этот метод к вашей ApprovalPeriod модели.

class ApprovalPeriod < ActiveRecord::Base
  .
  .
  .
  def increase_period
    self.increase! :period
  end
end

Контроллер:

def approve
  @approval_period = ApprovalPeriod.find(params[:period_id])
  @approval_period.increase_period
  redirect_to :back
  flash[:notice] = "Approval Period Updated."
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...