如何在if语句中检查url参数?

时间:2019-06-05 08:53:43

标签: ruby-on-rails

我想在if语句中检查url参数,但是我不知道正确的语法,或者甚至可能。

到目前为止我知道

<% if param(order: :top) %>
<% elsif param(order: :top && live: :true) %>

我都知道错了。

我要检查的url参数是:

www.url.com/?live=true&order=top

www.url.com/?order=top

index.html.erb

<% current_user.following_channels.each do |c| %>
<% if param(order: :top) %>
<% c.discussions.where('created_at > ?', 1.days.ago).each do |discussion| %>
<% elsif param(order: :top && live: :true) %>
<% c.discussions.where('live = ?', true).each do |discussion| %>
<% end %>
    Some more code...
<% end %>

2 个答案:

答案 0 :(得分:0)

无论如何,您的代码对我而言意义不大:

if params[:order] == 'top'
  if params[:live] == 'true'
    c.discussions.where(live: true).each do |discussion|
    .
    .
    .
    end
  else
    c.discussions.where('created_at > ?', 1.days.ago).each do |discussion|
    .
    .
    .
    end
  end
end

此外,在学习Rails时,应该将所有逻辑移至控制器和模型。

编辑:将逻辑移至控制器(未经测试的代码,可能会失败):

def index
  @channels = current_user.following_channels.includes(:discussions)
  @channels = @channels.where('discussions.created_at > ?', 1.days.ago) if params[:order] == 'top'
  @channels = @channels.where(discussions: {live: true}) if params[:live] == 'true'
  end
end

index.html.erb:

<% @channels.each do |channel| %>
  <div class="channel-container">
    <h2><%= channel.name %></h2>

    <ul>
    <% channel.discussions.each |discussion| %>
      <li><%= discussion.text %></li>
    <% end %>
    </ul>
  </div>
<% end %>

这样,视图对如何获取数据一无所知,只是将其呈现给用户。

您仍然可以将逻辑从控制器转移到模型,但是首先要对这一切感到满意。

答案 1 :(得分:0)

params["live"].nil? #this will return false if there is no url parameter called "live"

params["live"].blank? # this will return false if url parameter live is blank

对于其他参数,继续。正如CAmador所说,您需要将代码大部分移至控制器(在处理参数的情况下,代码应移至控制器)。