使用 Rails 中上一页的数据预填表单字段
Pre-fill form field with data from prior page in Rails
我最近将 Mailboxer
添加到我的 Rails 应用程序并且一切正常。
但是,我希望能够通过单击用户页面上的 "Message Me" 按钮来创建新消息,然后在表单时已经填写收件人(使用上一页中的用户)用于创建消息负载。
有问题的特定字段:
<%= select_tag 'recipients', recipients_options, multiple: true, class: 'new_message_recipients_field' %>
作为参考,recipients_options
可能不会在这种情况下发挥作用,但它是所有用户的列表——我主要在从除用户页面——在我的消息助手中定义
def recipients_options
s = ''
User.all.each do |user|
s << "<option value='#{user.id}'>#{user.first_name} #{user.last_name}</option>"
end
s.html_safe
end
还有我的messages_controller.rb
:
def new
end
def create
recipients = User.where(id: params['recipients'])
conversation = current_user.send_message(recipients, params[:message][:body], params[:message][:subject]).conversation
flash[:success] = "Message has been sent!"
redirect_to conversation_path(conversation)
end
我已经在每个用户页面上有 link 新消息表单...
<%= link_to 'Message me', new_message_path %>
但我不知道如何在后续表格中预填收件人。
有什么建议可以解决这个问题吗?
将 link_to
代码更改为:
<%= link_to 'Message me', new_message_path(recipient_id: @user.id) %>
在 messages#new
操作中,添加此代码:
def new
@users = User.all
end
并且,在消息形式中,将 select_tag 替换为:
<%= select_tag 'recipients', options_from_collection_for_select(@users, :id, :first_name, params[:recipient_id]), multiple: true, class: 'new_message_recipients_field' %>
我对收件人进行了一些更改 select。您可以使用 options_from_collection_for_select
方法生成该选项,而不是实现您自己的助手。
参考:http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_from_collection_for_select
我正在使用 Mailboxer,我可以从列表页面联系卖家。
用户点击列表页面上的联系卖家按钮,在下一页的收件人:表格中填写了卖家姓名。
我有与您的消息控制器中相同的 Create 方法。但在新方法中我有这个:
MessageController
def new
@chosen_recipient = User.find_by(id: params[:to].to_i) if params[:to]
end
我的列表页面上的联系按钮:
</p>
<strong>Contact Seller about "<%= @listing.title %>"</strong></br>
<%= link_to "Send message to #{@listing.user.name}", new_message_path(to: @listing.user.id), class: 'btn btn-default btn-sm' %>
<p>
新消息格式:
<%= form_tag messages_path, method: :post do %>
<div class="form-group">
<%= label_tag 'message[subject]', 'Subject' %>
<%= text_field_tag 'message[subject]', nil, class: 'form-control', required: true %>
</div>
<div class="form-group">
<%= label_tag 'message[body]', 'Message' %>
<%= text_area_tag 'message[body]', nil, cols: 3, class: 'form-control', required: true %>
</div>
<div class="form-group">
<%= label_tag 'recipients', 'Choose recipients' %>
<%= select_tag 'recipients', recipients_options(@chosen_recipient), multiple: true, class: 'form-control chosen-it' %>
</div>
<%= submit_tag 'Send', class: 'btn btn-primary' %>
<% end %>
希望对您有所帮助!
我最近将 Mailboxer
添加到我的 Rails 应用程序并且一切正常。
但是,我希望能够通过单击用户页面上的 "Message Me" 按钮来创建新消息,然后在表单时已经填写收件人(使用上一页中的用户)用于创建消息负载。
有问题的特定字段:
<%= select_tag 'recipients', recipients_options, multiple: true, class: 'new_message_recipients_field' %>
作为参考,recipients_options
可能不会在这种情况下发挥作用,但它是所有用户的列表——我主要在从除用户页面——在我的消息助手中定义
def recipients_options
s = ''
User.all.each do |user|
s << "<option value='#{user.id}'>#{user.first_name} #{user.last_name}</option>"
end
s.html_safe
end
还有我的messages_controller.rb
:
def new
end
def create
recipients = User.where(id: params['recipients'])
conversation = current_user.send_message(recipients, params[:message][:body], params[:message][:subject]).conversation
flash[:success] = "Message has been sent!"
redirect_to conversation_path(conversation)
end
我已经在每个用户页面上有 link 新消息表单...
<%= link_to 'Message me', new_message_path %>
但我不知道如何在后续表格中预填收件人。
有什么建议可以解决这个问题吗?
将 link_to
代码更改为:
<%= link_to 'Message me', new_message_path(recipient_id: @user.id) %>
在 messages#new
操作中,添加此代码:
def new
@users = User.all
end
并且,在消息形式中,将 select_tag 替换为:
<%= select_tag 'recipients', options_from_collection_for_select(@users, :id, :first_name, params[:recipient_id]), multiple: true, class: 'new_message_recipients_field' %>
我对收件人进行了一些更改 select。您可以使用 options_from_collection_for_select
方法生成该选项,而不是实现您自己的助手。
参考:http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/options_from_collection_for_select
我正在使用 Mailboxer,我可以从列表页面联系卖家。
用户点击列表页面上的联系卖家按钮,在下一页的收件人:表格中填写了卖家姓名。
我有与您的消息控制器中相同的 Create 方法。但在新方法中我有这个:
MessageController
def new
@chosen_recipient = User.find_by(id: params[:to].to_i) if params[:to]
end
我的列表页面上的联系按钮:
</p>
<strong>Contact Seller about "<%= @listing.title %>"</strong></br>
<%= link_to "Send message to #{@listing.user.name}", new_message_path(to: @listing.user.id), class: 'btn btn-default btn-sm' %>
<p>
新消息格式:
<%= form_tag messages_path, method: :post do %>
<div class="form-group">
<%= label_tag 'message[subject]', 'Subject' %>
<%= text_field_tag 'message[subject]', nil, class: 'form-control', required: true %>
</div>
<div class="form-group">
<%= label_tag 'message[body]', 'Message' %>
<%= text_area_tag 'message[body]', nil, cols: 3, class: 'form-control', required: true %>
</div>
<div class="form-group">
<%= label_tag 'recipients', 'Choose recipients' %>
<%= select_tag 'recipients', recipients_options(@chosen_recipient), multiple: true, class: 'form-control chosen-it' %>
</div>
<%= submit_tag 'Send', class: 'btn btn-primary' %>
<% end %>
希望对您有所帮助!