逗号分隔的数组与Rails中的text_field

时间:2011-12-01 17:00:44

标签: ruby-on-rails ruby

我有一些用户,可以有很多帖子,每个帖子都可以包含多个标记。我已经实现了使用帖子和标签之间的 has_and_belongs_to_many 关系。

创建新帖子时,用户可以使用逗号分隔的值列表对其进行标记(就像在SO上发布新问题时一样)。如果任何标签不存在,则应自动创建。这是帖子的 _fields.html.erb 部分:

<%= form_for @post do |f| %>
  <%= render 'shared/error_messages', :object => f.object %>

  <h1 class="post"><%= t(:new_post_message) %></h1>

  <div class="field">
    <%= f.label t(:title) %>
    <br />
    <%= f.text_field :title %>
  </div>

  <div class="field">
    <%= f.label t(:tag).pluralize %>
    <br />
    <%= f.text_field :tags %>
  </div>

  <div class="field">
    <%= f.label t(:text) %>
    <br />
    <%= f.text_area :content %>
  </div>

  <div class="actions">
    <%= f.submit t(:post_verb) %>
  </div>
<% end %>

立即使用 f.text_field:tags 会为文本生成带 [] 的输入元素。

我还没有在 posts_controller.rb 中使用标签,因为我不确定如何从参数中获取并拆分字符串值:

def create
  @post = current_user.posts.build(params[:post])
  if @post.save
    redirect_to root_path
  else
    @stream = []
    render 'pages/home'
  end
end

以前有人解决过这个问题吗?非常感谢。

1 个答案:

答案 0 :(得分:23)

我的偏好是在post.model上创建一个属性来读取标签。 e.g。

应用/模型/ post.rb

def tag_list
  self.tags.map { |t| t.name }.join(", ")
end

def tag_list=(new_value)
  tag_names = new_value.split(/,\s+/)
  self.tags = tag_names.map { |name| Tag.where('name = ?', name).first or Tag.create(:name => name) }
end

然后在您看来,您可以这样做:

<%= f.text_field :tag_list %>

而不是:tags

post模型将接受标记列表,拆分为标记名称,找到标记(如果存在),如果不存在则创建标记。无需控制器逻辑。

编辑这段代码当然依赖于您的标签模型,该模型具有名为name的属性(如果不只是替换您存储标签名称的任何属性),并且它在数据库(即您在标签模型中使用validates_uniqueness_of :name之类的东西)