如何使用选择下拉列表激活范围

时间:2015-10-26 01:13:13

标签: javascript ruby-on-rails ruby

我有一个选项下拉列表,我想在选中时激活不同的功能。

这是我正在使用的一些HTML:

     <select>
            <option value="all">all</option>
            <option value="tasks">tasks</option>
     </select>

以下是我的模型中的一些代码:

class Post < ActiveRecord::Base
    scope :task, -> { where(ideas: true) }
end

这是我控制器的一些代码:

def index
    #display posts with the params sent through the search bar

    #display the posts with by the params sent through clicking a tag
    if params[:tag]
        @posts = Post.all.order("created_at DESC").tagged_with(params[:tag])
    elsif params[:search]
        @posts = Post.all.order("created_at DESC").tagged_with(params[:search])
    elsif params[:user]
        #will eventually be for user's profile page
        @user = User.find(params[:user_id])
        @posts=@user.posts
    else
        @posts = Post.all.order("created_at DESC")
    end

end

非常基本。

当我选择“任务”时,我想要激活任务范围 - 本质上,我希望我的所有帖子都具有嵌套属性“task”(我使用cocoon gem来创建不同的帖子类型)以便在我出现时显示在我的下拉列表中选择“任务”选项。

范围可能不是最好的方法。如果您有任何其他建议,我很乐意接受它们。

1 个答案:

答案 0 :(得分:0)

我已成为我的控制器的粉丝几乎什么也没做。相反,他们只是调用另一个对象并传递工作。这允许您基本上放弃测试控制器。相反,这种方法提供了一些很容易隔离和测试的好PORO。

在上面的例子中,我会有一个像这样的控制器。

def index
  finder = PostFinder.new(params)
  @posts = finder.posts
end

既然你的控制器是愚蠢的,让这个新对象完成工作

class PostFinder

  def initialize(args={})
    @posts = []
    find_posts(args)
  end

  def posts
    @posts
  end

  private

  def find_posts(args={})
    # Magic hidden code to find your posts
    #@posts << posts we found...
  end

end

对于您的范围问题,您需要确保它包含在搜索表单提交中

 <select name="scope">
        <option value="all">all</option>
        <option value="tasks">tasks</option>
 </select>

它将在params中。你的控制器会将这些参数传递给你的PostFinder对象,然后由那个对象来包含params过滤帖子的逻辑。

例如,find_posts中的PostFinder方法将访问此参数

def find_posts(args={})
  if args[:scope]
    scoped_posts = Post.method(args[:scope]).call
  end
  # continue filter logic as needed
end