当索引中列出的对象(在数据库中)时,仅显示索引操作的按钮

时间:2014-05-22 14:36:01

标签: ruby button model-view-controller ruby-on-rails-4 erb

我有一个按钮,通过我在路线中设置的all_project_updates_path链接到项目更新索引操作。这是我的按钮代码:

    <%= button_tag type: "button", :class => "radius" do %>
    <%= link_to 'Project Updates', all_project_updates_path(@project),  :style => "color: white" %>
    <% end %>

我希望只有在数据库中有项目更新时才能看到此按钮。否则我希望这个按钮消失。我试过了:

    <% if all_project_updates_path(@project) != nil %> 
    <%= button_tag type: "button", :class => "radius" do %>
    <%= link_to 'Project Updates', all_project_updates_path(@project),  :style => "color: white" %>
    <% end %>
    <% end %>

<% if @updates != nil %>
<%= button_tag type: "button", :class => "radius" do %>
<%= link_to 'Project Updates', all_project_updates_path(@project),  :style => "color: white" %>
<% end %>
<% end %>

但这似乎不起作用。寻找一个简单的解释,因为我是红宝石的相对初学者。

这是路线:

get 'all_project_updates/:id' => 'project_updates#index', as: 'all_project_updates'

这是我的项目控制器(显示动作)

def show
    @project = Project.find(params[:id])
    @comments = Comment.all.where(:project_id => @project.id)
    @updates = ProjectUpdate.all.where(:project_id => @project.id)
end

这是我的项目更新控制器索引操作:

   def index
      @projectUpdates = ProjectUpdate.where(:project_id => params[:id])
      respond_to do |format|
         format.html
      end
   end

2 个答案:

答案 0 :(得分:1)

试试这个:

<% if @updates.any? %>
    <%= button_tag ... %>
<% end %>

@updates是一个空集合(确切地说是ActiveRecord_RelationProjectUpdate对象,如果没有找到记录,则它不是{{} 1}}。

答案 1 :(得分:1)

当您需要查询模型对象时,您正在检查路径助手all_project_updates_pathall_project_updates_path调用是返回网页之间链接路径的助手。

all_project_updates_path(@project) # => /all_project_updates/1

所以你真的在问:

'/all_project_updates/1'.nil? # => false

因为它只是一个字符串,所以不会是nil。

相反,您应该直接检查project_updates。我不确定你的模型是如何相关的,但假设Project has_many :project_updates,试试这个:

if @project.project_updates.any?

如果true有任何更新,则会返回@project

除了您当前的问题,我建议考虑nested resources是否更适合这种用法。您可以这样声明您的路线:

resources :projects do
  resources :project_updates
end

然后你会得到project_project_updates_path(@project)并且不再需要你的自定义路线,它几乎复制了这个功能。