【问题标题】:Rails: Form in partial for new nested ressourceRails:新嵌套资源的部分表单
【发布时间】:2015-09-30 07:26:36
【问题描述】:

我尝试通过表单为对话创建新消息。

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

这适用于为新对话创建新消息。

但是,当我尝试为已经有其他消息的对话创建新消息时,表单助手会为每个属于该对话的消息创建一个编辑字段

创建新的嵌套资源的最佳方法是什么?

最好使用相同的部分来为新对话创建新消息,并为已经有其他消息的现有对话创建新消息

【问题讨论】:

  • 发布您的 new 控制器代码,以便我更好地了解您的设置
  • 您可以在new.html.erbedit.html.erb 中调用该部分,并在控制器中相应地设置@conversation
  • @WesFoster 我没有消息#new 控制器,因为我想将新消息的表单附加到对话#show 操作的底部。
  • 你能发布你的conversations_controller吗?
  • 听起来@conversation 已分配给现有记录

标签: ruby-on-rails ruby ruby-on-rails-4 nested-forms


【解决方案1】:

几个小时后,我找到了答案。

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

【讨论】:

  • (@message = ) @conversation.messages.build 需要在控制器中。
猜你喜欢
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多