我有一个Conversation
模型,其中包含initiator
和recipient
属性,这两个属性都是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
答案 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
欢迎你,未来我。