2014-10-06 6 views
0

Это мой код для моего index.html.erb scaffold , так как вы можете видеть, что если else останавливает пользователя «показывать, редактировать или уничтожать» записи . Однако они могут создать новую запись Rota, нажав «Создать» Rotum. Я могу избавиться от административной части в Show, edit, destroy и , и каждый сможет сделать все. Но я хочу, чтобы пользователь имел возможность только показать правку, уничтожить их запись OWN и не все elses тоже , потому что это то, что происходит, когда я аутентифицирую пользователя для этого?Devise gem User Authentication Ruby on Rails

<h1>Listing rota</h1> 

<table id = "tabletest"> 
    <thead> 
    <tr> 
    <th>Name</th> 
    <th>Mobile</th> 
    <th>Email</th> 
    <th>Category</th> 
    <th>Other</th> 
    <th colspan="3"></th> 
    </tr> 
</thead> 

<tbody> 
    <% @rota.each do |rotum| %> 
    <tr> 
    <td><%= rotum.name %></td> 
    <td><%= rotum.mobile %></td> 
    <td><%= rotum.email %></td> 
    <td><%= rotum.category %></td> 
    <td><%= rotum.other %></td> 

<% if current_user.try(:admin?) %> 
    <td><%= link_to 'Show', rotum %></td> 
    <td><%= link_to 'Edit', edit_rotum_path(rotum) %></td> 
    <td><%= link_to 'Destroy', rotum, method: :delete, data: { 
    confirm: 'Are you sure?' } %></td> 
    </tr> 
    <% end %> 
     <% end %> 
</tbody> 
</table> 

<br> 
    <% if user_session %> 
<%= link_to 'New Rotum', new_rotum_path %> 
    <% end %> 

ответ

0

Предполагая, что соотношение между user и rota является has_many, контроллер индекс должен быть:

class RotasController < ApplicationController 
    def index 
    @rota = current_user.rotas 
    end 
end 

current_user является вспомогательный метод определяется Devise, как показано here

0

Случай 1: Если вы хотите показать роты, созданные пользователем в таблице.

class RotasController < ApplicationController 
    def index 
    @rota = Rota.where(current_user.try(:admin?) ? true : {user_id: current_user.id}) 
    end 
end 

Здесь он будет извлекать все записи для администратора, и если пользователь не является администратором, он будет получать связанные записи.

И в файле представления

<tbody> 
    <% @rota.each do |rotum| %> 
    <tr> 
    <td><%= rotum.name %></td> 
    <td><%= rotum.mobile %></td> 
    <td><%= rotum.email %></td> 
    <td><%= rotum.category %></td> 
    <td><%= rotum.other %></td> 

    <td><%= link_to 'Show', rotum %></td> 
    <td><%= link_to 'Edit', edit_rotum_path(rotum) %></td> 
    <td><%= link_to 'Destroy', rotum, method: :delete, data: { 
    confirm: 'Are you sure?' } %></td> 
    </tr> 
<% end %> 

Случай 2: В другом случае, если вы хотите показать все записи для каждого пользователя, но пользователь может получить доступ к «шоу, редактировать, удалять ', только если он создал это. Тогда вам нужно сделать что-то еще.

class RotasController < ApplicationController 
    def index 
    @rota = Rota.all 
    @is_admin = current_user.try(:admin?) 
    end 
end 

И по мнению

<tbody> 
    <% @rota.each do |rotum| %> 
    <tr> 
    <td><%= rotum.name %></td> 
    <td><%= rotum.mobile %></td> 
    <td><%= rotum.email %></td> 
    <td><%= rotum.category %></td> 
    <td><%= rotum.other %></td> 
    <% if @is_admin || (rotum.user_id == current_user.id) 
     <td><%= link_to 'Show', rotum %></td> 
     <td><%= link_to 'Edit', edit_rotum_path(rotum) %></td> 
     <td><%= link_to 'Destroy', rotum, method: :delete, data: { 
    confirm: 'Are you sure?' } %></td> 
    <% else %> 
     <td colspan='3'> &nbsp; </td> 
    <% end %> 
    </tr> 
<% end %> 

Надежда, она будет работать для вас. :)

+0

Я попробовал это, и администратор может сделать все, но когда пользователь входит в это говорит. « NoMethodError в/Rota неопределенный метод' user_id»для # » – Rahid