将模型中生成的错误传达给控制器

时间:2015-02-26 13:41:12

标签: ruby-on-rails ruby ruby-on-rails-4

将模型中生成的错误传播给用户的正确方法是什么?

例如,我有一个Reminder模型与时间相关联。我还有一个静态方法create_new如下:

def self.create_new date_string, time_string
    Reminder.new DateTime.parse(#{date_string} #{time_string})
end

在控制器中,我正在调用此方法来创建新提醒。表单视图和控制器很简单。 当用户在其时间字段中输入拼写错误(即:112:45而不是11:45)时,parse将引发错误。 在表单中通知用户输入拼写错误位置的最佳方法是什么?我想避免在客户端使用javascript。

谢谢!

2 个答案:

答案 0 :(得分:4)

我建议在Reminder模型中使用验证来处理它。您可以按照here的说明编写自己的自定义验证程序,也可以使用validates_timeliness之类的现有宝石。

这允许您遵循Rails的约定优于配置方法,并避免在模型上编写自定义创建方法或使用救援块乱丢控制器代码。

您的控制器操作将变为

def create
  @reminder = Reminder.new(reminder_params)
  if @reminder.save
    # redirect or whatever
  else
    flash.now[:error] = @reminder.errors.full_messages
  end
end

然后可以在update动作中执行相同的操作。希望这会有所帮助。

答案 1 :(得分:1)

在您的控制器中:

def action
  r = create_new params
  -- do stuff
rescue StandardError => e
  flash.now[:error] = e.message
end

在您的视图中,您可以只渲染flash.now [:error]的输出以显示错误(如果有)。 我还将flash变量用于所有验证消息,以及更新模型时或创建失败时的情况。

来源:http://guides.rubyonrails.org/action_controller_overview.html#the-flash