Rails: 添加来自不同模型的表单

Rails: Add form from different model

在我的 rails 应用程序中,我有一个可以包含许多项目消息的项目模型。

project has_many project_messages

projects/show.html.erb 中,我想显示该项目的所有项目消息,但也希望从此视图创建新的项目消息。 目前,我无法从此视图创建新的项目消息。

我查看了一些链接,但 none 对我有用 Adding Form For Different Model In Same View, Rails: Show form from different model in a view

我的projects/show.html.erb文件引用如下:

<div>
 <% render partial: 'project_messages/form', :object => @project_message %>
</div>

projects_controller.rb 文件中,我包含了以下内容:

  def show
    @project_message = ProjectMessage.new
  end

&

def project_params
  params.require(:project).permit(:title, :description, :phase_id, :RAGStatus, :currentpphase_id,  :project_messages_attributes => [:pMessage, :user_id, :project_id])
end

并且在 project.rb 文件中我还有以下代码:

accepts_nested_attributes_for :project_messages

project_messages/_form.html.erb

<%= form_with(model: project_message, local: true) do |form| %>
  <% if project_message.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(project_message.errors.count, "error") %> prohibited this project_message from being saved:</h2>

      <ul>
      <% project_message.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

<%= form.label :pMessage %>
<%= form.text_field :pMessage, id: :project_message_pMessage, :class => 'au-input au-input--full au-input--h65', placeholder: 'Type a message' %>
  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

project_messages 部分表单未呈现,因此我无法从此视图添加新消息。

错误:

undefined local variable or method `project_message' for #<#<Class:0x007f5455ced910>:0x007f5459ef8a30>
Did you mean?  @project_message

当我将@project_message 添加到部分时,它不会呈现。

project_messages/_form.html.erb中,这一行:

<%= form_with(model: project_message, local: true) do |form| %>

应该改成这样:

<%= form_with(model: object, local: true) do |form| %>

您已将局部变量 object 分配给局部变量,因此您应该使用它。

另外,partials也可以这样称呼:

<% render partial: 'form', object: @project_message %>

通常情况下,当渲染部分像:

<% render partial: 'form', object: @project_message %>

因为您将 @project_message 作为特别命名的 object 参数传递,这将创建一个具有部分名称的特殊变量 - 在本例中为 form

因此在部分中,您可以引用这个变量:

<%= form_with(model: form, local: true) do |form| %>

...不过,在这种情况下,调用局部变量form其实意义不大!所以我倾向于使用你传入的任何名称——例如,你可以这样做:

<% render partial: 'form', project_message: @project_message %>

然后在部分:

<%= form_with(model: project_message, local: true) do |form| %>

有关详细信息,请参阅:http://guides.rubyonrails.org/layouts_and_rendering.html#passing-local-variables