Обработка исключений Rails при отправке формы - PullRequest
0 голосов
/ 18 марта 2011

Я хочу знать, каков наилучший способ обработки исключения, возникающего при сохранении модели во время отправки формы. В настоящее время я использую такой фрагмент кода.


class Mycontroller
  def edit
    @customer = Customer.new
    @permissions = Hash.new
    @permissions['save'] = true
    @permissions['clear'] = true
    @permissions['some_other'] = false
  end

  def submit_handler
    @customer = Customer.find(params[:id])
    @customer.update_attributes!(params[:customer])
    redirect_to(:controller => 'XXXXXX', :action => 'edit', :id=>params[:id])
  rescue ActiveRecord::RecordInvalid => e    
    render :action => :edit, :id => params[:id]
  end
end

А вот мой взгляд с именем edit.html.erb

<% form_for :customer, :url => {:action =>"submit_handler", :id=>id} do |acc|%>
<%= render :partial => 'fields', :locals => { :acc => acc } %>  
<table align="center">
<tr align="center">
<% if @permissions['some_other'] == true %>
<td id='some_other' align="center"><%= submit_tag "Some other" %></td>
<%end%>
<% if @permissions['save'] == true %>
<td id='save'align="center"><%= submit_tag "Save" %></td>
<%end%>
<% if @permissions['clear'] == true %>
<td id='clear' align="center"><%= button_to "Clear", :action => :clear %></td>
<%end%>
</table>
<%end%>

Насколько я понимаю, приведенный выше фрагмент кода заключается в том, что метод render не вызывает действие "edit" перед вызовом шаблона "edit". Я передаю объект (@permissions) из обработчика действия «edit» в шаблон «edit». Все работает нормально, когда я выполняю перенаправление на действие редактирования, но не во время рендеринга, поскольку объект (@permissions), который я передал из контроллера в шаблон, недоступен во время рендеринга. Я все делаю правильно? Это способ Rails для обработки исключений? Если так, как я могу передать объект (@permissions) в шаблон, когда я вызываю метод render? Любые указатели будут с благодарностью.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 18 марта 2011

Этот код является избыточным:

@customer.update_attributes!(params[:customer])
@customer.save!

update_attributes также сохранит, поэтому вызов save! ничего не делает. Более идиоматический способ сделать это в рельсах такой:

def submit_handler
  @customer = Customer.find(params[:id])

  # Update your attributes
  if @customer.update_attributes(params[:customer])
    # Redirect on success
    redirect_to(:controller => 'XXXXXX', :action => 'edit', :id=>params[:id])
  else
    # Render the action template -- no need to reset the ID here
   render :action => :edit
  end
end

Есть ли какая-то причина, по которой вам нужно вызвать исключение, когда сохранение не может быть завершено?

1 голос
/ 18 марта 2011

Вы вызываете методы save! и update_attributes!, и эти методы вызовут исключение ActiveRecord, если любая из проверок завершится неудачно.Кроме того, ваш код избыточен при выполнении update_attributes! и save!.Вам лучше написать эти методы традиционным способом.

class Mycontroller
  def submit_handler
    @customer = Customer.find(params[:id])        
    if @customer.update_attributes(params[:customer])
      redirect_to(:controller => 'XXXXXX', :action => 'edit', :id=>params[:id])
    else
      get_edit_permissions()    
      render :action => :edit
    end
  end

  def edit
    @customer = Customer.find(params[:id])
    get_edit_permissions()
  end

  def get_edit_permissions
    @permissions = Hash.new
    @permissions['save'] = true
    @permissions['clear'] = true
    @permissions['some_other'] = false
    # @permissions = {'save' => true, 'clear' => true, 'some_other' => false}
  end
end

На самом деле вы можете упростить свою жизнь, объявив customer как ресурс вways.rb (map.resources :customer в Rails 2.3.5) и присвоение методу submit_handler значения create, так как это будет следовать спокойной маршрутизации, рекомендованной Rails.

0 голосов
/ 18 марта 2011

Посмотрите здесь информацию о том, как спасать исключения, возникающие в действиях контроллера: http://apidock.com/rails/v2.3.8/ActiveSupport/Rescuable/ClassMethods/rescue_from

...