Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中,使用check_box_标记,提交查询后如何保持复选框处于选中状态?_Ruby On Rails_Ruby_Activerecord_Rails Models - Fatal编程技术网

Ruby on rails 在Rails中,使用check_box_标记,提交查询后如何保持复选框处于选中状态?

Ruby on rails 在Rails中,使用check_box_标记,提交查询后如何保持复选框处于选中状态?,ruby-on-rails,ruby,activerecord,rails-models,Ruby On Rails,Ruby,Activerecord,Rails Models,好的,我知道这是Saas课程,人们也一直在问与此相关的问题,但我花了很多时间尝试和阅读,我被卡住了。首先,当你有一个名为电影的模型时,是将收视率作为一个模型并将它们关联起来更好,还是将收视率保持在一个浮动的数组中(!)。其次,这里是我现在在控制器中的内容: def index @movies = Movie.where(params[:ratings].present? ? {:rating => (params[:ratings].keys)} : {}).order(params

好的,我知道这是Saas课程,人们也一直在问与此相关的问题,但我花了很多时间尝试和阅读,我被卡住了。首先,当你有一个名为电影的模型时,是将收视率作为一个模型并将它们关联起来更好,还是将收视率保持在一个浮动的数组中(!)。其次,这里是我现在在控制器中的内容:

def index

@movies = Movie.where(params[:ratings].present? ? {:rating => (params[:ratings].keys)} :   {}).order(params[:sort])
@sort = params[:sort]
@ratings = Ratings.all

end
现在,我决定创建一个评级模型,因为我认为它会更好。以下是我的看法:

= form_tag movies_path, :method => :get do

Include:
- @ratings.each do |rating|
 = rating.rating
 = check_box_tag "ratings[#{rating.rating}]"
= submit_tag "Refresh"
我尝试了所有与在复选框标记中使用以“.include?(rating)?”结尾的条件三元相关的操作:“我尝试了所有应该有效的操作,但是没有。我不想要确切的答案,我只需要指导。提前谢谢

更新(控制器的方法):

这是我的控制器中读取此散列的索引方法-为了清晰起见。我为之前的模糊性道歉

def index    
  @all_stores = Product.all_stores
  @selected_stores = params[:stores] || session[:stores] || {}

  if @selected_stores == {}
    @selected_stores = Hash[@all_stores.map {|store| [store, store]}]
  end
  if params[:stores] != session[:stores]
    # session[:stores] = @selected_stores
    session[:stores] = params[:stores]
    redirect_to :stores => @selected_stores and return
  end
  @products = Product.order("created_at desc").limit(150).find_all_by_store(@selected_stores.keys).group_by { |product| product.created_at.to_date}
. . . etc
两件事

1)
.order(params[:sort])
为sql注入攻击打开了大门, 有人可能会通过将其放入查询字符串中来删除您的所有用户

http://localhost:3000/movies?sort=email%3B+从+用户+中删除+——

请参阅,此问题不存在于。where中,rails将清理where方法的输入

2) 次要的是,AREL会延迟对db的实际调用,直到您对集合进行迭代,这样您就可以“构建”查询,使用三元运算符可能更容易理解这种语法

@movies = Movie.order(xxxxxx)
@movies = @movies.where(:rating => params[:ratings].keys) if params[:ratings].present?
3) 对于您的评级,就像cdesrosiers所说的常数是可以的,那么您的观点

Movie::RATINGS.each do |rating|
  check_box_tag "ratings[]", rating # <input type="checkbox" name="ratings[]" value="PG" />
一些链接


在我看来,数据库的主要用途是存储在相对较短的时间段内可能发生变化的数据。您的电影可以具有的评级集是相对静态的,因此我只将其作为数组常量存储在您的电影类中,例如
评级=['R','PG',等等]
一个常量?这很有意义。我没有想到。起初我有一个实例变量@ratings=['R','PG',等等。],然后我想也许我必须使用一个模型。谢谢。没问题,这应该会使它更容易。这就是我所做的,我刚读到我应该在我的模型中加入常数。好的。谢谢你!是的,当我试图解决一个问题时,我总是直接进行查询,这是一个坏习惯。总有一天我会忘记在真实环境中更改它。事实上,我不是我对你的答案感到满意。我仍然停留在同一个地方。我正在尝试勾选复选框!我知道我可以得到一个校验值数组。但我很难查询数组。这就是我所说的三元。不是控制器中的那个。我的意思是我在我的视图中这样做:@movie.ratings.include?(rating)?true:" . 那不行。如何保持复选框处于选中状态?我还尝试执行params[:ratings]。include?(rating)。看起来太像个新手了。我试了很多东西。在我花了两天的时间尝试了很多事情之后,我总是在这里问。我有一个很大的自我。更新的答案-基本上它在做
params[:ratings]。include?(rating)
刚刚存储并初始化了空数组,以防它不存在。我不知道发生了什么,但我只是做了:=复选框标记“ratings[{rating}]”,rating,params[:ratings]。include?(rating)在我看来,就是这样,就这个。我已经试过15次了,现在它能用了!!。我完全不明白。我不。
# controller
@selected_ratings = (params[:ratings].present? ? params[:ratings] : [])

# view
Movie::RATINGS.each do |rating|
  check_box_tag "ratings[]", rating, @selected_ratings.include?(rating)
  # <input type="checkbox" name="ratings[]" value="PG" checked="checked" />
@movies = @movies.where("rating IN (?)", params[:ratings]) if params[:ratings].present? and params[:ratings].any?