[RUBY-ON-RAILS] 방법 "다음 게시물"내 쇼보기 "이전 게시물 '링크로 : 레일?
RUBY-ON-RAILS방법 "다음 게시물"내 쇼보기 "이전 게시물 '링크로 : 레일?
나는 레일에 새로운 해요 ... 미소
내 블로그 aplication에서 나는 "이전 게시물"링크를 내 쇼보기 하단에 "다음 게시물"링크를 갖고 싶어.
이걸 어떻게해야합니까?
감사!
해결법
-
==============================
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.이 문제를 방지하기 위해 다음과 같이 나는 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.내 방법은 자동 모델의 범위를 사용할 수 있습니다. 예를 들어, 전용 디스플레이 게시물에 할 수 있습니다 "출판."
내 방법은 자동 모델의 범위를 사용할 수 있습니다. 예를 들어, 전용 디스플레이 게시물에 할 수 있습니다 "출판."
모델에서 :
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.이것은 내가 그것을 한 방법이다. 첫째, 귀하의 게시물 모델이라는 범위의 몇 가지를 추가 :
이것은 내가 그것을 한 방법이다. 첫째, 귀하의 게시물 모델이라는 범위의 몇 가지를 추가 :
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.will_paginate 보석에게 시험을주십시오. 그것은 당신이 게시물 항목 페이지를 매기는 필요 기능을 모두 제공합니다. 여기에서도 배울 수
will_paginate 보석에게 시험을주십시오. 그것은 당신이 게시물 항목 페이지를 매기는 필요 기능을 모두 제공합니다. 여기에서도 배울 수
당신이 다음 및 이전 버튼을 추가하려는 경우 예제 코드에 너무 여기에서 볼 수 있습니다.
-
==============================
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.당신은 정말이 쿼리, "이전"및 "다음"의 각 하나를 실행해야합니다. 당신이 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 열을 사용하려는 경우, 당신은 확실히 그 컬럼에 인덱스를 갖고 싶어합니다.
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
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] .js.erb VS의의 .js (0) | 2020.02.23 |
---|---|
[RUBY-ON-RAILS] 어디 공공 레일 응용 프로그램에서 중요한 데이터를 저장하기 위해? (0) | 2020.02.23 |
[RUBY-ON-RAILS] 어떻게 슬림 템플릿 내 커피 스크립트 엔진에 액세스 인스턴스 변수 (0) | 2020.02.23 |
[RUBY-ON-RAILS] 매개 변수 before_filter (0) | 2020.02.23 |
[RUBY-ON-RAILS] 루비에서 객체 속성에 의해 UNIQ (0) | 2020.02.23 |