首页 > 解决方案 > Rails 6 - 可排序

问题描述

我在rails 6中遇到HTML可排序更新问题我想通过网页拖放图像并且效果很好但是,当我想更新订单时,我在控制台日志中发现404未找到错误,并且在找身份证。顺便说一句,我将此脚本用于 HTML 可排序 https://github.com/jordanhudgens/devcamp-portfolio/blob/master/app/assets/javascripts/html.sortable.js

控制器 :

class PortfoliosController < ApplicationController
  before_action :set_portfolio_item, only:[:edit , :show, :update , :destroy]
  layout "portfolio"
  access all: [:show, :index , :angular], user: {except: [:destroy, :new , :create , :update , :edit , :sort]}, site_admin: :all
    def index
        # You can filter what you want to show in protfolio
        # Portfolio.where(subtitle: "Angular")
        # You can define it in models and call the method here
        # It must create on Portfolio.rb in models
        # You can create scope too on models and call
        @portfolio_items = Portfolio.by_position
    end
    def angular
      @angular_portfolio_items = Portfolio.angular
    end
    def sort
      params[:order].each do |key, value|
        Portfolio.find(value[:id]).update(position: value[:position])
      end
      head :ok
    end
    def new
      @portfolio_item = Portfolio.new
      3.times { @portfolio_item.technologies.build }
    end
    def create
      @portfolio_item = Portfolio.new(portfolio_params)
        respond_to do |format|
        if @portfolio_item.save
          format.html { redirect_to portfolios_path, notice: 'Portfolio was successfully created.' }
        else
          format.html { render :new }
        end
      end
      end
    def edit
    end
    def update
      respond_to do |format|
        if @portfolio_item.update(portfolio_params)
          format.html { redirect_to portfolios_path, notice: 'The record was successfully updated.' }
        else
          format.html { render :edit }
        end
      end
    end
    def show
    end
    def destroy
      # Perform the lookup
      # Destroy/delete the record
      @portfolio_item.destroy
      #Redirect
      respond_to do |format|
      format.html { redirect_to portfolios_url, notice: 'Portfolio was successfully deleted!.' }
    end
  end
    private
    def portfolio_params
      params.require(:portfolio)
    end
    def set_portfolio_item
      @portfolio_item = Portfolio.find(params[:id])
    end
    end

这是我的路线.rb

Rails.application.routes.draw do
  devise_for :users, path: '', path_names: { sign_in: 'login', sign_out: 'logout', sign_up: 'register' }
  resources :portfolios, except: [:show] do
    put :sort, on: :collection
  end
  get 'portfolio/:id' , to: 'portfolios#show', as: 'portfolio_show'
  get 'angular-items' , to: 'portfolios#angular'
  # we can pass anything here after get
  get 'about', to: 'pages#about'
  get 'contact', to: 'pages#contact'
  resources :blogs do
    member do
      get :toggle_status
    end
  end
  resources :posts
  root to: 'pages#home'
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end

这是我用于 HTML 可排序的 CoffeeScript

ready = undefined
set_positions = undefined

set_positions = ->
  $('.card').each (i) ->
    $(this).attr 'data-pos', i + 1
    return
  return

ready = ->
  set_positions()
  $('.sortable').sortable()
  $('.sortable').sortable().bind 'sortupdate', (e, ui) ->
    updated_order = []
    set_positions()
    $('.card').each (i) ->
      updated_order.push
        id: $(this).data('id')
        position: i + 1
      return
    $.ajax
      type: 'PUT'
      url: '/portfolios/sort'
      data: order: updated_order
    return
  return

$(document).ready ready

感谢您的帮助!

标签: javascriptruby-on-railsrubycoffeescriptruby-on-rails-6

解决方案


推荐阅读