如何覆盖 rails 数组中元素的每五个实例?

How do I overwrite every fifth instance of an element in an array in rails?

首先我会说我是 rails 的新手。这个问题是针对我目前正在参加的 class。课程主题是 CRUD,内容是存储帖子及其标题和评论的数据库。

说明如下:

Overwrite the title of every fifth instance of Post with the text "CENSORED".

这是我的控制器:

class PostsController < ApplicationController

  def index

  @posts = Post.all
  end

  def show
  end

  def new
  end

  def edit
  end
end

这是我的视图文件:

<h1>All Posts</h1>

<% @posts.each do |post| %>

    <div class="media">
      <div class="media-body">
        <h4 class="media-heading">
          <%= link_to post.title, post %>
        </h4>
      </div>
    </div>
<% end %>

这是我的模型:

class Post < ActiveRecord::Base
  has_many :comments
end

我真的不确定从哪里开始,非常感谢任何帮助。朝着正确的方向前进会很棒。谢谢。

使用each_with_index代替each;如果索引模 5 为零,则对其进行审查。

如果目的是 显示 "CENSORED" 每五个元素,那么我会看一下 each_with_index:http://apidock.com/ruby/Enumerable/each_with_index

如果@posts是数组形式

@posts.each_with_index do |post,index|
  post.update!(title: "CENSORED") if index % 5 == 0
end

如果@posts 在您的数据库中

@posts.each do |post|
  post.update!(title: "CENSORED") if (post.id % 5 == 0)
end
@posts = Post.all
@posts.each_with_index do |post, index| 
  if index % 5 == 4 # since index starts at 0, every 5th object will be at positions 4, 9, 14, 19 etc.
    # Do the change on post object
    post.update_attributes(title: 'CENSORED')
  end
end

这里有几种方法,其中 @posts = Post.all,并假设第一个 post 将被审查:

#1

e = [[:CENSOR] + [:PUBLISH]*4].cycle
  #=> #<Enumerator: [[:CENSOR, :PUBLISH, :PUBLISH, :PUBLISH, :PUBLISH]]:cycle>    
@posts.each {|p| p.update_attributes(title: 'CENSORED') if e.next==:CENSOR }

#2

(0...@posts.size).step(5) {|i| @posts[i].update_attributes(title: 'CENSORED')}