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
在我的 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