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

Ruby on rails 在Rails中,如何使用相同的表单来创建和更新对象?,ruby-on-rails,forms,controller,routes,ruby-on-rails-5,Ruby On Rails,Forms,Controller,Routes,Ruby On Rails 5,我使用的是Rails 5。为了避免重复太多的代码,我希望在创建和更新对象时使用相同的表单。我想将表单提交给我的控制器的创建方法以创建 def create @user_notification = UserNotification.new(user_notification_params) ... end <%= form_for @user_notification, :url => user_notifications_path do |f| %>

我使用的是Rails 5。为了避免重复太多的代码,我希望在创建和更新对象时使用相同的表单。我想将表单提交给我的控制器的创建方法以创建

  def create
    @user_notification = UserNotification.new(user_notification_params)
    ...
  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>
    ...
及其更新方法,用于更新

  def update
    ...
  end
我有这个表单,它可以很好地创建

  def create
    @user_notification = UserNotification.new(user_notification_params)
    ...
  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>
    ...
我已经在config/routes.rb文件中定义了这一点

  resources 'user_notifications'

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

您可以使用“渲染”来提供帮助 下面是示例代码

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

在new.html.erb和edit.html.erb中,使用render调用它

<%= render 'user_notification' %>

我认为您可能遇到的问题是,您正在表单中显式设置URL:

form_for @user_notification, :url => user_notifications_path
user\u notifications\u path
将根据请求方法与两个路由匹配。使用带有GET的
user\u notifications\u path
将与索引操作匹配,使用POST将与创建操作匹配

对于您需要
用户通知\u路径的情况,请注意它是单数的。此帮助程序将与GET请求上的显示操作、PUT/PATCH请求上的更新操作以及删除请求上的销毁操作相匹配

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

form_for @user_notification

Rails将根据
@user\u notification
中的模型是否为新记录自动设置正确的URL和请求方法,并自动尝试为您找到正确的路由。

解决这一问题的最简单方法是生成一个scaffold。scaffold将为您提供默认视图,包括一个指向u的部分表单在创建和编辑操作中使用se。