Rails: 新嵌套资源的部分形式
Rails: Form in partial for new nested ressource
我尝试通过表单为对话创建新消息。
class Conversation < ActiveRecord::Base
has_many :messages
accepts_nested_attributes_for :messages
到目前为止,我正在使用部分内容来创建新消息 _new_message.html.erb:
<div id="message_dialog">
<%= simple_form_for [:front, @conversation] do |f| %>
<%= f.input :challenge_id, as: :hidden, input_html: { value: @conversation.challenge.id } %>
<%= f.simple_fields_for :messages do |m| %>
<%= m.input :subject %>
<%= m.input :text, as: :text %>
<%= m.input :recipient_id, as: :hidden, input_html: { value: @conversation.challenge.user_id } %>
<%= m.input :sender_id, as: :hidden, input_html: { value: current_user.id } %>
<% end %>
<%= f.button :submit %>
<% end %>
</div>
在 ConversationsController 的显示操作中,我定义:
@conversation = Conversation.find(params[:id])
@conversation.messages.build
这适用于为新对话创建新消息。
但是,当我尝试为已有其他消息的对话创建新消息时,表单助手会为属于该对话的每条消息创建一个编辑字段
创建新嵌套资源的最佳方法是什么?
最好,我想使用相同的部分为新对话创建一条新消息,并为已有其他消息的现有对话创建一条新消息。
几个小时后我找到了答案。
simple_fields_for 可以有一个或两个参数。
有一个参数
<%= f.simple_fields_for :messages do |g| %>
表单助手为对话中的所有消息创建输入字段。
有两个参数
<%= f.simple_fields_for :messages, @conversation.messages.build do |f| %>
表单助手仅为我要创建的新消息创建输入字段。这意味着我们在这里根据source.
独立指定对象名称和对象本身。
啊,别忘了将嵌套参数列入白名单:
def conversation_params
params.require(:conversation).permit(..., messages_params: [:subject, ...])
end
我尝试通过表单为对话创建新消息。
class Conversation < ActiveRecord::Base
has_many :messages
accepts_nested_attributes_for :messages
到目前为止,我正在使用部分内容来创建新消息 _new_message.html.erb:
<div id="message_dialog">
<%= simple_form_for [:front, @conversation] do |f| %>
<%= f.input :challenge_id, as: :hidden, input_html: { value: @conversation.challenge.id } %>
<%= f.simple_fields_for :messages do |m| %>
<%= m.input :subject %>
<%= m.input :text, as: :text %>
<%= m.input :recipient_id, as: :hidden, input_html: { value: @conversation.challenge.user_id } %>
<%= m.input :sender_id, as: :hidden, input_html: { value: current_user.id } %>
<% end %>
<%= f.button :submit %>
<% end %>
</div>
在 ConversationsController 的显示操作中,我定义:
@conversation = Conversation.find(params[:id])
@conversation.messages.build
这适用于为新对话创建新消息。
但是,当我尝试为已有其他消息的对话创建新消息时,表单助手会为属于该对话的每条消息创建一个编辑字段
创建新嵌套资源的最佳方法是什么?
最好,我想使用相同的部分为新对话创建一条新消息,并为已有其他消息的现有对话创建一条新消息。
几个小时后我找到了答案。
simple_fields_for 可以有一个或两个参数。
有一个参数
<%= f.simple_fields_for :messages do |g| %>
表单助手为对话中的所有消息创建输入字段。
有两个参数
<%= f.simple_fields_for :messages, @conversation.messages.build do |f| %>
表单助手仅为我要创建的新消息创建输入字段。这意味着我们在这里根据source.
独立指定对象名称和对象本身。啊,别忘了将嵌套参数列入白名单:
def conversation_params
params.require(:conversation).permit(..., messages_params: [:subject, ...])
end