0

我一直按照Brandon Tilley 关于创建私人消息系统的说明进行操作,并希望修改传递私人消息收件人的方式(从复选框到文本框)。

在我看来,我有这个:

<%= f.label :to %><br />
<%= f.text_field :to, placeholder: "Recip...(separated by commas)" %>

如何接受输入作为将整数数组传递给控制器​​的文本输入?

额外细节:

全视图:

<h1>New Conversation</h1>

<%= form_for(@conversation) do |f| %>
  <div>
  <%= f.label :to %><br />
  <%= f.text_field :to, placeholder: "Recip...(separated by commas)" %>
  </div>
  <br />
  <%= f.fields_for :conversation do |c| %>
    <div>
      <%= c.label :subject %>
      <%= c.text_field :subject %>
    </div>
    <%= c.fields_for :messages do |m| %>
    <div>
    <%= m.label :body %><br />
    <%= m.text_area :body %>
    </div>
    <% end %>
  <% end %>

  <%= f.submit %>
<% end %>

在控制器内我有这个:

def create
redirect_to users_path unless current_user
@conversation = UserConversation.new(params[:user_conversation])
@conversation.user = current_user
@conversation.conversation.messages.first.user = current_user
...

在模型中我有这个:

  accepts_nested_attributes_for :conversation

  delegate :subject, :to => :conversation
  delegate :users, :to => :conversation

  attr_accessor :to
  *before_create :create_user_conversations*

private

def create_user_conversations
return if to.blank?

to.each do |recip|
  UserConversation.create :user_id => recip, :conversation => conversation
end
end
end

编辑:新模型:

def to
 to.map(&:user_id).join(", ") *stack too deep error*
end

def to=(user_ids)
  @to = user_ids.split(",").map do |recip|
  UserConversation.create :user_id => recip.strip, :conversation => conversation
end
4

2 回答 2

1

rails 助手没有设置为自动处理任意数组输入。

您可以使用多个复选框或解析您的文本输入,这是一个逗号分隔的用户名列表。在你的模型中

def to=(string)
  @to = User.where(:name => string.split(',')).select(:id).map(&:id)
end

为了更好的用户体验,您可以使用tagsinput jquery 插件和/或自动完成。

另请注意,如果您使用表单来修改同一对象,则需要将逗号分隔的字符串重新生成为 text_field 输入的 :value 选项,以正确预填充您的编辑表单。

<%= text_field_tag "user_conversation[to]", (@conversation.to || []).join(',') %>
于 2013-02-11T15:54:36.180 回答
0

在视图中:

<%= f.label :to %><br />
<%= f.text_field :to, placeholder: "Recip...(separated by commas)" %>

在模型中:

attr_accessible :to
attr_accessor :to

before_create :create_user_conversations

private

to.split(",").each do |recip|
  UserConversation.create :user_id => recip, :conversation => conversation
end
于 2013-02-11T22:09:09.983 回答