ruby-on-rails - Rails 中带有 text_field 的逗号分隔数组

标签 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

有没有人解决过这个问题?非常感谢。

最佳答案

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

app/models/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 %>

代替:标签

post 模型将接受标签列表,拆分为标签名称,如果存在则查找标签,如果不存在则创建标签。不需要 Controller 逻辑。

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

关于ruby-on-rails - Rails 中带有 text_field 的逗号分隔数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8345273/

相关文章:

ruby-on-rails - Rails3 应用程序的起点,它将成为 iphone 应用程序的后端

javascript - jQuery UI 自动完成功能在 Rails 应用程序中不起作用

Ruby 并行赋值

c - 使用 ruby​​ 内置类时如何调用 ruby​​ 扩展方法

ruby-on-rails - 在 Rails 3 中添加来自 URL 的图像作为附件

ruby-on-rails - HAML:仅当条件为真时才创建容器/包装器元素

html - collection_select 中自定义 text_method 的最佳实践?

ruby - 所有规范的 rspec shared_context 和 include_context

ruby - 无法使用 ActiveSupport::Inflector 进行复数化/单数化(在 irb 中)

ruby-on-rails - 是否有适用于 Ruby 或 Rails 的类似 iPython 的 shell?