我有一个选项下拉列表,我想在选中时激活不同的功能。
这是我正在使用的一些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来创建不同的帖子类型)以便在我出现时显示在我的下拉列表中选择“任务”选项。
范围可能不是最好的方法。如果您有任何其他建议,我很乐意接受它们。
答案 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