簡體   English   中英

如何使用選擇下拉菜單激活作用域

[英]How to activate scopes with a select dropdown

我有一個選項下拉列表,我想在選擇這些選項時激活不同的功能。

這是我正在使用的一些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

很基本。

當我選擇“任務”時,我希望激活任務范圍-本質上,我希望所有帶有嵌套屬性“任務”的帖子(我正在使用繭形寶石創建不同的帖子類型)在選擇“任務”選項。

范圍可能不是最好的方法。 如果您還有其他建議,我很樂意接受。

我已經成為控制器的支持者,幾乎什么也不做。 相反,他們只是簡單地調用另一個對象並傳遞工作。 這使您基本上可以放棄測試控制器。 相反,此方法提供了一些易於隔離和測試的不錯的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>

它將在參數中。 控制器會將這些參數傳遞給PostFinder對象,然后從那里直到該對象包含有關參數如何過濾帖子的邏輯。

例如, find_posts在方法PostFinder將訪問該PARAM

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM