Techioz Blog

Rails ボタンを使用して、表示される配列要素を段階的に増やすにはどうすればよいですか?

概要

@necklines@スカート という 2 つの配列があり、それぞれすべてのネックライン モデルとスカート モデルで構成されています。

一度に 1 つのネックラインと 1 つのスカートを表示しようとしています。現在表示されている要素を段階的に増加または減少させるための 2 つのボタンがあります。

ページレイアウトは次のようになります。

@necklines [@ni]@スカート [@si] を呼び出し、ボタンを使用して @ni@si の値を増減することでこれを実行しようとしています。

ただし、どのボタンをクリックしても要素は変わりません。

これが私のMainController.rbです

    def home
        @necklines = Neckline.all
        @skirts = Skirt.all
        
        if @ni.nil?
            @ni = 0
        end

        if @si.nil?
            @si = 0
        end

    end

    def increase_neck
        if @ni >= @necklines.count - 1
            @ni = 0
        else
            @ni += 1
        end
        redirect_to root_path    
    end

    def decrease_neck
        if @ni <= 0
            @ni = @necklines.count - 1
        else
            @ni -= 1
        end
        redirect_to root_path
    end

    def increase_skirt
        if @si >= @skirts.count - 1
            @si = 0
        else
            @si += 1
        end 
        redirect_to root_path   
    end

    def decrease_skirt
        if @si <= 0
            @si = @skirts.count - 1
        else
            @si -= 1
        end   
        redirect_to root_path 
    end

ここが私のhome.html.erbです

<h1> Main#home </h1>


<div>
  <div class='neckline'>
    <h3> <%= @necklines[@ni].style_name %> </h3>
    <div class='child inline-block-child'> <%= button_to "<", "/home/decrease_neck", method: :post %> </div>
    <div class='child inline-block-child'> <%= image_tag @necklines[@ni].image %> </div>
    <div class='child inline-block-child'> <%= button_to ">", "/home/increase_neck", method: :post %> </div>
  </div>
  <div class='skirt'>
    <div class='child inline-block-child'> <%= button_to "<", "/home/decrease_skirt", method: :post %> </div>
    <div class='child inline-block-child'> <%= image_tag @skirts[@si].image %> </div>
    <div class='child inline-block-child'> <%= button_to ">", "/home/increase_skirt", method: :post %> </div>
    <h3> <%= @skirts[@si].style_name %> </h3>
  </div>
</div>

これが私のルートです。rb

Rails.application.routes.draw do
  get '/necklines', to: 'neckline#index'
  get "/necklines/:id", to: "neckline#show"
  get '/skirts', to: 'skirt#index'
  get '/skirts/:id', to: 'skirt#show'

  # Defines the root path route ("/")
  root "main#home"
end

エラーは、ボタンをクリックするたびに @ni@si が 0 に戻されるのではないかと思いますが、次に進む方法がわかりません。

初めてのアプリでつまずいてしまい、コードが汚くて申し訳ありません。

解決策

インスタンス変数は各リクエストを処理しません。インデックスに自動インクリメントされるフィールドを追加します (現時点では ID を使用するだけかもしれません)。これをルート パラメーターとして渡します。

したがって、インデックスには次のようなものになります。

def index 
  @neckline = params[:neckline_idx] ? Neckline.find_by(id: params[:neckline_idx]) : Neckline.first
  @skirt = params[:skirt_idx] ? Skirt.find_by(id: params[:skirt_idx]) : Skirt.first
end

インクリメント/デクリメントへのリンクは次のようになります。

# neckline increment/decrement links
link_to "<", root_path(neckline_idx: @neckline.id - 1, skirt_idx: params[:skirt_idx]) 
link_to ">", root_path(neckline_idx: @neckline.id + 1, skirt_idx: params[:skirt_idx])

# skirt increment/decrement links
link_to "<", root_path(skirt_idx: @skirt.id - 1, neckline_idx: params[:neckline_idx]) 
link_to ">", root_path(skirt_idx: @skirt.id + 1, neckline_idx: params[:neckline_idx])

最終的には、リンクを進化させて #next_id や #previous_id のようなメソッドを呼び出すことが必要になる場合があります。

link_to "<", root_path(skirt_idx: @skirt.previous_id, neckline_idx: params[:neckline_idx]) 
link_to ">", root_path(skirt_idx: @skirt.next_id, neckline_idx: params[:neckline_idx])

レコードの破棄を許可する場合にインデックス内のギャップを処理できるようにするには、次のようにします。

def next_id
  self.where("id > ?", self.id).minimum(:id)
end