我的rails表单不能与has_scope一起使用

时间:2016-03-28 14:32:48

标签: javascript ruby-on-rails forms

(如果这是一个愚蠢的问题,我已经编码了不到一个月,所以道歉)。我有一个用户名模型,电子邮件和类型。我创建了一个索引表单,您可以按类型进行筛选,它应该显示结果。 表格和过滤器显示我有2个问题的预期: 1. usertype是重复的。例如,如果我有5个用户(使用faker gem创建),其中每个用户或供应商,过滤器显示客户和供应商5次而不是两次 2.当我选择过滤器时,会显示所有结果并且不会过滤它们。

这是我的模特:

class User < ActiveRecord::Base
has_many :microposts
scope :by_userType, ->  userType { where(:userType => userType) }

这是我的控制器

    class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]
  has_scope :by_userType, type: :array #, :using => [:userType]


  # GET /users
  # GET /users.json
  #def index
  #  @users = User.all
  #end

  def index
    @users = apply_scopes(User).all
  end

  # GET /users/1
  # GET /users/1.json
  def show
  end

  # GET /users/new
  def new
    @user = User.new
  end

  # GET /users/1/edit
  def edit
  end

  # POST /users
  # POST /users.json
  def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /users/1
  # PATCH/PUT /users/1.json
  def update
    respond_to do |format|
      if @user.update(user_params)
        format.html { redirect_to @user, notice: 'User was successfully updated.' }
        format.json { render :show, status: :ok, location: @user }
      else
        format.html { render :edit }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /users/1
  # DELETE /users/1.json
  def destroy
    @user.destroy
    respond_to do |format|
      format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def user_params
      params.require(:user).permit(:name, :email, :userType)
    end
end

这是我的表格:

<p id="notice"><%= notice %></p>

<h1>Listing Users</h1>


<%= form_tag users_path, method: 'get', id: "users_search" do%>
<% @users = User.all %>
<% @users.each do |user|%>
<%= check_box_tag "by_userType[]", user.userType %><%= user.userType %><br>
<% end %>
<%= submit_tag "submit" %>
<% end %>

<div id="users"><%= render 'user_list' %></div>

<script type="text/javascript">
  $(function () {
    $('input[type=checkbox]').change(function(){
      $.get($('#users_search').attr('action'),
      $('#users_search').serialize(), null, 'script');
      return false;
    });

  $('users_search').submit(function() {
    $.get(this.action, $(this).serialize(), null, 'script');
    return false;
    });
  });

</script>

提前感谢您的时间!

1 个答案:

答案 0 :(得分:0)

这里有几件事。首先,欢迎使用rails,欢迎使用Stack Overflow。

+1,用于询问问题并提供您目前为止所做的代码示例。

请注意,对于标准化,案例在rails中很重要。对于范围声明,您应该使用蛇盒。 UserModel是类名,user_model是蛇案。

现在,就实际实施情况而言,我会有所不同。如果您注意到基于某个字段的一个模型的大多数ajax过滤不使用与参数相同的模型,那么它不仅仅是唯一的方式,但我更喜欢它,因为它允许以后灵活地向user_type添加额外的字段。这意味着,如果您将用户类型提取到自己的模型中,那么您可以轻松地从:name的user_type属性中过滤用户。

所以你的用户模型会有:

class User < ActiveRecord::Base
  has_many :microposts
  belongs_to :user_type
  scope :by_user_type, ->  user_type { where(:user_type => user_type) }
end

然后创建一个名为user_model的新模型

rails g scaffold user_model name:string slug:string avatar:string

**请注意,附加字段只是示例,名称只需要一个。但是如果你想让用户进行url搜索,那么slug很容易使用。即yoursite.com/user_type/sellers

现在创建一个迁移来删除用户中现有的userType字段,并删除一个新的关系。

rails g migration modify_user_type_in_user

该文件的内容将是

class ModifyUserTypeInUser < ActiveRecord::Migration
  def change
    remove_column :users, :userType
    add_reference :users, :user_type, index: true
  end
end

现在编辑新的user_type.rb模型并添加users

的关系
class UserType < ActiveRecord::Base
  has_many :users 
end

你还需要使用你在帖子中没有提到的UJS。单击表单域时,它正在发送javascript(ajax)请求。这意味着,为了更改数据,您需要一个javascript响应模板。

所以添加文件app/views/users/index.js.erb并在其中加入以下内容:

$("#users").html('<%= j(render("user_list", users: @users)) %>');
$("table tbody tr:nth-of-type(even)").css("background","#BD9FB1");

最后,您需要更改表单,因此它代表了正确的可搜索模型。因此,请修改'app / views / users / index.html.erb'

<p id="notice"><%= notice %></p>

<h1>User Filter</h1>

<%= form_tag users_path, method: 'get', id: "users_search" do%>
<% @user_types = UserType.all %>
<% @user_types.each do |user_type|%>
<%= check_box_tag "by_user_type[]", user_type.id %><%= user_type.name %><br>
<% end %>
<%= submit_tag "submit" %>
<% end %>

<div id="users"><%= render 'user_list' %></div>

<script type="text/javascript">
  $(function () {
    $('input[type=checkbox]').change(function(){
      $.get($('#users_search').attr('action'),
      $('#users_search').serialize(), null, 'script');
      return false;
    });

  $('users_search').submit(function(e) {
    e.preventDefault();
    $.get(this.action, $(this).serialize(), null, 'script');
    return false;
    });
  });

</script>