【问题标题】:Need two buttons to index either all items or items current user is assigned?需要两个按钮来索引所有项目或当前用户分配的项目?
【发布时间】:2014-10-11 15:51:31
【问题描述】:

Ruby 2.0.0、Rails 4.0.3、jquery-datatables-rails 2.2.3 (DataTables 1.10.2)

我想在我的表单上有两个按钮,一个显示所有项目,另一个仅显示当前分配给当前用户的项目。鉴于我什至为此走上了正确的道路,而且我不确定自己是否正确,我有两个问题。还是我走错了路?

在控制器操作中,我试图将当前用户传递给由 ItemsDatatable 控制器创建的视图。调试显示索引操作运行了两次。第一次,按预期设置用户。第二次,用户为 nil,因此它永远不会传递给 ItemsDatatable。为什么会这样,我该如何解决? (如果我在控制器索引操作中无条件设置用户,则通过。)

第二个问题更深奥。如果我能够在初始化中设置@user,我如何将其传递给 as_json 和其他 ItemsDatatable 操作?我想这是特定于 jquery-datatables-rails 的,我可能必须找出它的逻辑来决定如何做到这一点?或者有没有一种 Rails 方法可以很好地做到这一点?

仅供参考,这是 RailsCasts 340 中的 DataTables 模式,已针对 DataTables 1.10.2 进行了更新。

感谢您的帮助。

主页按钮:

  <%= link_to 'Status-My Items',  items_path(select: "mine"), :class => 'btn btn-primary' %>
  <%= link_to 'Status-All Items', items_path(select: "all" ), :class => 'btn btn-primary' %>

ItemsController 索引操作:

  def index
    user ||= params[:select] == "mine" ? current_user : nil
    respond_to do |format|
      format.html
      format.json { render json: ItemsDatatable.new(view_context, user) }
    end
  end

ItemsDatatable 控制器:

class ItemsDatatable < ApplicationController
  delegate :params, :h, :link_to, :edit_item_path, :new_item_path, :location, to: :@view

  def initialize(view, user)
    @view = view
    @user = user
  end

  def as_json(options = {})
    {
        draw: params[:draw].to_i,
        recordsTotal: Item.count,
        recordsFiltered: items.total_entries,
        data: data
    }
  end

  private

  def data
    todays_date = Date.today
    items.map do |item|
      [
          link_to(item.stock_number, edit_item_path(item))
      ]
    end
  end

  def items
    @items ||= fetch_items
  end

  def fetch_items
    items = Item.order("#{sort_column} #{sort_direction}")
    items = items.page(page).per_page(per_page)
    if params[:search][:value].present?
      items = items.where("stock_number ilike :search, search: "%#{params[:search][:value]}%")
    end
    items
  end

  def page
    params[:start].to_i/per_page + 1
  end

  def per_page
    params[:length].to_i > 0 ? params[:length].to_i : 10
  end

  def sort_column
    columns = %w[stock_number]
    columns[params[:order]['0'][:column].to_i]
  end

  def sort_direction
    params[:order]['0'][:dir] == "desc" ? "desc" : "asc"
  end
end

【问题讨论】:

    标签: ruby-on-rails jquery-datatables-rails


    【解决方案1】:

    在我看来,这两个问题的答案都是使用会话存储:

    观点:

      <%= link_to 'My Items',  items_path(my_view: current_user.id),
                  class: 'btn btn-primary' %>
      <%= link_to 'All Items', items_path(my_view: "all"),
                  class: 'btn btn-primary' %>
    

    控制器:

    session[:my_view] ||= params[:my_view]
    

    使用地点:

    unless @view.session[:my_view] == "all"
      user = User.find(@view.session[:my_view]).name
      items = items.where("clshadow = \'#{user}\'")
    end
    @view.session[:my_view] = nil
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多