如何通过rails中的form_for标记传递嵌套模型关系

时间:2016-09-20 08:18:19

标签: ruby-on-rails actionview

我有一个Conversation模型,其中包含initiatorrecipient属性,这两个属性都是User个模型。

创建form_for @conversation时如何传递@conversation.initiator = User.first@conversation.recipient = User.third

class Conversation < ApplicationRecord
  belongs_to :initiator, foreign_key: :initiator_id, class_name: 'User'
  belongs_to :recipient, foreign_key: :recipient_id, class_name: 'User'
end

class User < ApplicationRecord
  has_many :conversations
end

2 个答案:

答案 0 :(得分:0)

正如您所提到的,任何会话对象都将具有发起人和收件人属性,那么它将如下所示:

def new_form
    @conversation = Conversation.new(initiator: User.first, recipient: User.third)
end

现在您的两个值都可以与模型对象@conversation一起使用,您可以在表单中的任何位置访问它们,如下所示:

<强> new.html.erb

<%= form_for @conversation do |f| %>
    <%= f.text_field :body, :value => @conversation.initiator %>
<% end %>

希望这会对你有所帮助。

答案 1 :(得分:0)

警告:

如果您正在制作实际的消息传递应用,请不要按原样使用该代码。

绝不允许用户操纵敏感数据。在下面的示例中,名为Alice的人可以编辑隐藏字段并注入Bob的id,从而从Bob的帐户发送消息。

我实际上是从设计的current_user帮助中获取了Alice的,并使用pundit来确保授权。

<强>解决方案:

修正了它,结果是hidden_field标记第一个参数必须是@variable写成符号(:variable),第二个参数必须是:attribute

然后您可以在param[:variable] #> {attribute: value}

下找到它

恕我直言,这是完成这项工作的一种愚蠢且非直观的方式,但嘿,它的确有效。然后你就可以强大地对它进行加密并将其加载到模型中。

以下是代码:

在我的控制器的new方法中:

# GET /conversations/new
def new
  @conversation = Conversation.new
  @initiator = User.first
  @recipient = User.second
end

然后在new.html.erb

<%= form_for @conversation do |f| %>
  <%= f.text_field :subject, class: "form-control" %>

  <%= hidden_field :initiator, :id %>
  <%= hidden_field :recipient, :id %>

  <%= f.button 'Submit', class: 'btn-primary pull-right' %>
<% end %>

然后在控制器的create方法中:

  def create
    @conversation = Conversation.new(conversation_params)

    @conversation.initiator = User.find_by(initiator_form_params)
    @conversation.recipient = User.find_by(recipient_from_params)

    if @conversation.save
      redirect_to :back, notice: 'Conversation was successfully created.'
    else
      redirect_to :back, notice: 'Conversation was not sent!'
    end
  end

创建强大的参数

  private

    def conversation_from_params
      params.require(:conversation).permit(:subject)
    end

    def initiator_from_params
      params.require(:initiator).permit(:id)
    end

    def recipient_from_params
      params.require(:recipient).permit(:id)
    end

欢迎你,未来我。