如何在rails中对帖子进行排序并让它们在AJAX中重新加载?

时间:2017-08-30 03:18:36

标签: jquery ruby-on-rails ajax sorting

Here是一个很好的起点,但我不确定如何从视图中调用这些方法,也不知道如何从视图中更新内容。这个想法是导航将按升序按日期,按日期降序,向上投票和向下投票进行排序。我正在使用该行为作为可投票的宝石 我对我的模型的最佳猜测是

#Message.rb
scope :recent, -> { order(created_at: :desc) }
scope :upvoted,    -> { order(:cached_votes_up => :desc) }
scope :oldest, -> { order(created_at: :asc) }

def self.sort_by(sort_param)
  case sort_param
  when 'recent'
    recent
  when 'upvoted'
    upvoted
  when 'oldest'
    oldest
  else
    all
  end
end

我不知道如何调用此方法(可能来自索引),我也不知道如何使用AJAX来更新视图。

2 个答案:

答案 0 :(得分:0)

你应该阅读指南

http://guides.rubyonrails.org/working_with_javascript_in_rails.html并更好地了解 AJAX

你打算怎么触发这个方法?用户会以某种方式点击按钮或链接吗?

这是如何将表单的提交按钮绑定到ajax操作

的示例

http://guides.rubyonrails.org/working_with_javascript_in_rails.html#server-side-concerns

基本上form button submit将执行users_controller#createcreate.js.erb将在$("<%= escape_javascript(render @user) %>").appendTo("#users");

中执行以下代码
js.erb

正如您从此示例中看到的那样,优势在于,因为这是@user文件,您可以使用变量#user并将其附加到link div

您可以搜索 rails ajax 以获取更多信息,您可以观看YouTube关于 AJAX 的视频,以便更好地理解

这个想法是 AJAX 代表异步javascript和xml请求,现在我们使用json而不是xml。客户端将发送请求,服务器将发送响应。信息通过 json 发送,客户端用作脚本语言 json

在你的情况下,我建议。确定触发button的{​​{1}}或request,然后按照指南设置rails ajax,配置controller#action以{{1}回复并创建js文件,以便您可以重新排序页面上的信息。您可以使用js.erb中重新排序的项目列表创建变量实例,然后将controller#action附加list of items html

答案 1 :(得分:0)

对我来说最简单的答案是 将范围添加到我的模型

#Message.rb
scope :recent, -> { order("created_at DESC") }
scope :oldest, -> { order(created_at: :asc) }
scope :upvoted, -> { order(:cached_votes_up => :desc) }
scope :downvoted, -> { order(:cached_votes_down => :desc) }

使用对索引的渲染操作定义控制器中的方法。

#messages_controller.rb
def recent
 @messages = Message.recent
 render action: :index
end

def oldest
 @messages = Message.oldest
 render action: :index
end

def upvoted
 @messages = Message.upvoted
 render action: :index
end

def downvoted
 @messages = Message.downvoted
 render action: :index
end

通过集合创建相应的路线。

collection do
  get :recent
  get :oldest
  get :upvoted
  get :downvoted
end

我的视线导航。

<ul class="nav nav-tabs card-header-tabs">
  <li class="nav-item">
    <%= link_to "Recent", recent_messages_path, class: "nav-link active" %>
  </li>
  <li class="nav-item">
    <%= link_to "Oldest", oldest_messages_path, class: "nav-link active" %>
  </li>
  <li class="nav-item">
    <%= link_to "Upvoted", upvoted_messages_path, class: "nav-link active" %>
  </li>
  <li class="nav-item">
    <%= link_to "Downvoted", downvoted_messages_path, class: "nav-link active" %>
  </li>
</ul>

我的应用程序在https://boiling-beach-61535.herokuapp.com/