轨道中的嵌套表格

时间:2014-07-03 17:53:19

标签: ruby-on-rails ruby-on-rails-4 simple-form nested-attributes

我正在尝试保存嵌套表单,但不确定如何使其正常工作。 无法使用'body'保存private_message。

@private_message_topic.private_messages.build

它使用private_message_topic_id设置构建private_message。不知道如何添加params [:body]虽然

希望你能帮助我。感谢。

class PrivateMessageTopic < ActiveRecord::Base
  belongs_to :recipient, class_name: "User", foreign_key: "recipient_id"
  belongs_to :sender, class_name: "User", foreign_key: "sender_id"

  has_many :private_messages
  accepts_nested_attributes_for :private_messages
end


class PrivateMessage < ActiveRecord::Base
  belongs_to :recipient, class_name: "User", foreign_key: "recipient_id"
  belongs_to :sender, class_name: "User", foreign_key: "sender_id"
  belongs_to :private_message_topic
end


class PrivateMessageTopicsController < ApplicationController
  before_action :find_user
  before_action :find_private_message, only: [:show]

  def index
  end

  def show
  end

  def new
    @private_message_topic = current_user.sent_messages.build
    @private_message_topic.private_messages.build
  end

  def create
    @private_message_topic = current_user.sent_messages.build(private_message_topic_params)
    @private_message_topic.recipient = @user

    if @private_message_topic.save
      #Todo
    else
      redirect_to action: :new
      flash.alert = "oops!"
    end
  end

  def inbox
    @inbox_messages = @user.inbox_messages
  end

  def sent
    @sent_messages = @user.sent_messages
  end

  private
    def find_user
      @user = User.find(params[:user_id])
    end

    def find_private_message
      @private_message = PrivateMessageTopic.find(params[:id])
    end

    def private_message_topic_params
      params.require(:private_message_topic).permit(:title, private_messages_attributes: [:body])
    end
end


private_message_topics/_form

= simple_form_for @private_message_topic, url: user_private_message_topics_path, method: :post do |form|
  = form.input :title

  = form.simple_fields_for @private_message_topic.private_messages.new do |form|
    = form.input :body

  = form.submit

1 个答案:

答案 0 :(得分:0)

将控制器中的current_user.sent_messages.buildcurrent_user.sent_messages.new方法中的new更改为create

在您的表单中,由于您已经在控制器中构建它,因此无需执行private_message.new。表单应如下所示:

<强> private_message_topics / _form

= simple_form_for @private_message_topic, url: user_private_message_topics_path, method: :post do |form|
  = form.input :title

  = form.fields_for :private_messages do |f|
    = f.input :body

  = form.submit

另外,我认为没有必要在表单声明中指定url和方法。 Rails自动设置正确的URL和方法。

相关问题