복붙노트

[RUBY-ON-RAILS] 방법 "다음 게시물"내 쇼보기 "이전 게시물 '링크로 : 레일?

RUBY-ON-RAILS

방법 "다음 게시물"내 쇼보기 "이전 게시물 '링크로 : 레일?

나는 레일에 새로운 해요 ... 미소

내 블로그 aplication에서 나는 "이전 게시물"링크를 내 쇼보기 하단에 "다음 게시물"링크를 갖고 싶어.

이걸 어떻게해야합니까?

감사!

해결법

  1. ==============================

    1.각각의 제목이 독특하고 알파벳이 필요한 경우, 포스트 모델이 시도.

    각각의 제목이 독특하고 알파벳이 필요한 경우, 포스트 모델이 시도.

    def previous_post
      self.class.first(:conditions => ["title < ?", title], :order => "title desc")
    end
    
    def next_post
      self.class.first(:conditions => ["title > ?", title], :order => "title asc")
    end
    

    그런 다음보기에서 그 연결할 수 있습니다.

    <%= link_to("Previous Post", @post.previous_post) if @post.previous_post %>
    <%= link_to("Next Post", @post.next_post) if @post.next_post %>
    

    테스트되지 않은, 그러나 그것은 당신에게 가까이해야합니다. 다른 정렬 순서를해야하는 경우 고유 한 속성 (등 created_at, ID)로 제목을 변경할 수 있습니다.

  2. ==============================

    2.이 문제를 방지하기 위해 다음과 같이 나는 ID + 1이 존재하지 않지만 ID + 2가하는 곳 모델 방법을 사용했다.

    이 문제를 방지하기 위해 다음과 같이 나는 ID + 1이 존재하지 않지만 ID + 2가하는 곳 모델 방법을 사용했다.

    def previous
      Post.where(["id < ?", id]).last
    end
    
    def next
      Post.where(["id > ?", id]).first
    end
    

    내보기 코드에서, 난 그냥 이렇게 :

      - if @post.previous
        = link_to "< Previous", @post.previous
      - if @post.next
        = link_to "Next >", @post.next
    
  3. ==============================

    3.내 방법은 자동 모델의 범위를 사용할 수 있습니다. 예를 들어, 전용 디스플레이 게시물에 할 수 있습니다 "출판."

    내 방법은 자동 모델의 범위를 사용할 수 있습니다. 예를 들어, 전용 디스플레이 게시물에 할 수 있습니다 "출판."

    모델에서 :

    def self.next(post)
      where('id < ?', post.id).last
    end
    
    def self.previous(post)
      where('id > ?', post.id).first
    end
    

    보기에서

    <%= link_to 'Previous', @posts.previous(@post) %>
    <%= link_to 'Next', @posts.next(@post) %>
    

    컨트롤러에서

    @photos = Photo.published.order('created_at')
    

    관련 RSpec에 테스트 :

    describe '.next' do
      it 'returns the next post in collection' do
        fourth_post = create(:post)
        third_post = create(:post)
        second_post = create(:post)
        first_post = create(:post)
    
        expect(Post.next(second_post)).to eq third_post
      end
    
      it 'returns the next post in a scoped collection' do
        third_post = create(:post)
        decoy_post = create(:post, :published)
        second_post = create(:post)
        first_post = create(:post)
    
        expect(Post.unpublished.next(second_post)).to eq third_post
      end
    end
    
    describe '.previous' do
      it 'returns the previous post in collection' do
        fourth_post = create(:post)
        third_post = create(:post)
        second_post = create(:post)
        first_post = create(:post)
    
        expect(Post.previous(third_post)).to eq second_post
      end
    
      it 'returns the previous post in a scoped collection' do
        third_post = create(:post)
        second_post = create(:post)
        decoy_post = create(:post, :published)
        first_post = create(:post)
    
        expect(Post.unpublished.previous(second_post)).to eq first_post
      end
    end
    

    참고 : 컬렉션의 첫 번째 / 마지막 게시물에 도달했을 때 작은 문제가있을 것입니다. 나는 조건부로보기 도우미가 존재하는 경우에만 이전 또는 다음 버튼을 보여 좋습니다.

  4. ==============================

    4.이것은 내가 그것을 한 방법이다. 첫째, 귀하의 게시물 모델이라는 범위의 몇 가지를 추가 :

    이것은 내가 그것을 한 방법이다. 첫째, 귀하의 게시물 모델이라는 범위의 몇 가지를 추가 :

    def previous
      Post.find_by_id(id - 1, :select => 'title, slug etc...')
    end
    
    def next
      Post.find_by_id(id + 1, :select => 'title, slug etc...')
    end
    

    당신은 아마 링크를 표시하기위한 완전히 채워 포스트 인스턴스를 검색하지 않기 때문에 필드를 제한하는 옵션을 선택 :의 사용을합니다.

    그럼 내 posts_helper에서 나는이 방법을 가지고 :

    def sidebar_navigation_links
      next_post = @post.next
      previous_post = @post.previous
      links = ''
      if previous_post
        links << content_tag(:h3, 'Previous')
        links << content_tag(:ul, content_tag(:li,
                                  content_tag(:a, previous_post.title,
                                              :href => previous_post.permalink)))
      end
      if next_post
        links << content_tag(:h3, 'Next', :class => 'next') if previous_post
        links << content_tag(:h3, 'Next') if previous_post.nil?
        links << content_tag(:ul, content_tag(:li,
                                  content_tag(:a, next_post.title,
                                              :href => next_post.permalink)))
      end
      content_tag(:div, links)
    end
    

    나는 확실히이 덜 장황로 리팩토링 할 수있어,하지만 의도는 분명하다. 당신은 예를 들어, 정렬되지 않은 목록을 사용하도록 선택되지 않을 수도 있습니다 분명히 마크 업 요구 사항은 광산 다를 수 있습니다.

    첫 번째 게시물에 있다면 그들은 더 이전 게시물 수 없게됩니다 반대로, 마지막 게시물에 있다면 그들은 더 다음 게시물 없을 것이기 때문에 중요한 것은 만약 문장의 사용이다.

    마지막으로, 단순히보기에서 도우미 메소드를 호출합니다

    <%= sidebar_navigation_links %>
    
  5. ==============================

    5.will_paginate 보석에게 시험을주십시오. 그것은 당신이 게시물 항목 페이지를 매기는 필요 기능을 모두 제공합니다. 여기에서도 배울 수

    will_paginate 보석에게 시험을주십시오. 그것은 당신이 게시물 항목 페이지를 매기는 필요 기능을 모두 제공합니다. 여기에서도 배울 수

    당신이 다음 및 이전 버튼을 추가하려는 경우 예제 코드에 너무 여기에서 볼 수 있습니다.

  6. ==============================

    6.나는 특히 작업의 이런 종류의 보석 proximal_records을 만들었습니다 그리고 모델의 모든 동적으로 생성 범위에서 작동합니다.

    나는 특히 작업의 이런 종류의 보석 proximal_records을 만들었습니다 그리고 모델의 모든 동적으로 생성 범위에서 작동합니다.

    https://github.com/dmitry/proximal_records

    기본 예제 :

    class Article < ActiveRecord::Base
      include ProximalRecords
    end
    
    
    scope = Article.title_like('proximal').order('created_at DESC, title ASC')
    current_record = scope.to_a[5]
    p, n = current_record.proximal_records(scope) # will find record 5 and 7
    
  7. ==============================

    7.당신은 정말이 쿼리, "이전"및 "다음"의 각 하나를 실행해야합니다. 당신이 created_at 열이 있다고 가정 할 수 있습니다.

    당신은 정말이 쿼리, "이전"및 "다음"의 각 하나를 실행해야합니다. 당신이 created_at 열이 있다고 가정 할 수 있습니다.

    의사 코드 :

    # get prev
    select * from posts where created_at < #{this_post.created_at} order by created_at desc limit 1
    
    # get next
    select * from posts where created_at > #{this_post.created_at} order by created_at desc limit 1
    

    물론 "this_post는"현재 게시물입니다.

    게시물이 AUTO_INCREMENT 컬럼에 저장하고 재사용 ID를 해달라고하는 경우는 created_at 대신에 id 컬럼을 사용할 수 있습니다 - ID 열에 이미 인덱싱해야합니다. 당신이 created_at 열을 사용하려는 경우, 당신은 확실히 그 컬럼에 인덱스를 갖고 싶어합니다.

  8. from https://stackoverflow.com/questions/1275963/rails-next-post-and-previous-post-links-in-my-show-view-how-to by cc-by-sa and MIT license