在Rails中,如何使用相同的表单来创建和更新对象?

时间:2017-08-30 02:25:55

标签: ruby-on-rails forms controller routes ruby-on-rails-5

我正在使用Rails 5.为了不复制太多代码,我想使用相同的表单来创建和更新我的对象。我希望表单提交给我的控制器的创建方法来创建...

  def create
    @user_notification = UserNotification.new(user_notification_params)
    ...
  end

及其更新方法......

  def update
    ...
  end

我有这个表单,适用于创建...

<%= form_for @user_notification, :url => user_notifications_path do |f| %>
  <%= f.hidden_field :id %>
    ...
  <div class="field">
    <%= f.label :price, 'Price' %> <span class="required">*</span> <br>
    <%= f.text_field :price, :size => 30 %>
  </div>
    ...

但是在更新时,我在提交更新请求后会收到此错误...

No route matches [PATCH] "/user_notifications"

我在config / routes.rb文件中定义了这个

  resources 'user_notifications'

但我觉得这个问题比路线问题更深刻。如何调整表单定义。有没有办法在创建和更新时使用相同的部分,如果是,我需要对上面的内容进行哪些调整?

2 个答案:

答案 0 :(得分:2)

我认为您可能遇到的问题是您在表单中明确设置了网址:

form_for @user_notification, :url => user_notifications_path

user_notifications_path将匹配两条路线,具体取决于请求方法。使用带有GET的user_notifications_path将与索引操作匹配,并且POST将与create操作匹配。

对于您的情况,您需要user_notification_path,请注意它是单数。此帮助程序将匹配GET请求上的show操作,对PUT / PATCH请求的更新操作以及对DELETE请求的销毁操作。

使用form_for时,您应该能够在不明确设置URL的情况下获得所需的效果:

form_for @user_notification

Rails会根据@user_notification中的模型是否为新记录自动设置正确的URL和请求方法,并自动尝试为您找到正确的路径。

答案 1 :(得分:0)

您可以使用渲染来帮助rails render guilde 这是示例代码

首先将表单重命名为_user_notification.html.erb(注意:请确保在文件名前添加_

并在你的new.html.erb和edit.html.erb中,使用render来调用它

imageView.setDrawingCacheEnabled(true);
Bitmap bitmap = imageView.getDrawingCache();