2013-12-05 2 views
0

Я пытаюсь разрешить пользователю читать, обновлять или уничтожать форму, которую они сами создали. У меня проблемы.CanCan: Может делать RUD, но не C

В моем ability.rb, я

can [:update, :read, :destroy], Form.where(:user => user) 

при условии, что пользователь является атрибутом формы. Я могу получить формы (и ответы на формы) для отображения, когда у меня нет этой строки в классе способностей, но я, очевидно, не хочу, чтобы люди могли удалять формы других пользователей. Я уже звонил

load_and_authorize_resource 

, чтобы вызвать CanCan в контроллере. В настоящее время я эту ошибку:

The can? and cannot? call cannot be used with a raw sql 'can' definition. The checking code cannot be determined for :index Form(id: integer, user_id: integer, policy: boolean, two_adult: boolean, training: boolean, attribute_name: boolean, attribute: boolean, agree_to_form: boolean, user_signature: string, signature_date: date, printed_date: datetime, created_at: datetime, updated_at: datetime) 

(Изменены некоторые имена для личной жизни я также использую Завещание, кстати, если это меняет что-нибудь.)

Любая помощь будет принята с благодарностью. Благодаря!

Edit: Будет ли решение, как ...

can :read, Form do |form| 
    form.user == user 
    end 

быть возможность?

Edit2: Мой взгляд ...

<% @forms.each do |form| %> 
    <tr> 
    <td><%= form.user %></td> 
    <td><%= form.policy %></td> 
    <td><%= form.two_adult %></td> 
    <td><%= form.training %></td> 
    <td><%= form.other_attribute %></td> 
    <td><%= form.attribute %></td> 
    <td><%= form.agree_to_covenant %></td> 
    <td><%= form.user_signature %></td> 
    <td><%= form.signature_date %></td> 
    <td><%= form.printed_date %></td> 

    <% if can? :read, @form %> 
     <td><%= link_to 'Show', form %></td> 
    <% end %> 
    <% if can? :update, @form %> 
     <td><%= link_to 'Edit', edit_form_path(form) %></td> 
    <% end %> 
    <% if can? :destroy, @form %> 
     <td><%= link_to 'Destroy', form, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
    <% end %> 
    </tr> 
<% end %> 

Я также заметил на обновив страницу, что хэш-пользователь изменяет каждый раз. Это проблематично.

Edit3: Ability.rb информация Документы, касающиеся ...

if user.is_camper? 
    can :read, Camp 
    can :read, Payment, Payment.where(:user => user) 
    can :create, Payment 
    can :read, Form, :user => user.id 

Here is a visual of what happens too.

ответ

2

Ваш последний вариант (определяется через блок) должен работать.

См. Примеры here.

В вашем случае вы можете определить с помощью хэш - это проще

can :read, Form, :user_id => user.id 

И согласно this point вы можете отдельно определить :read, :create, :update и :destroy

код на странице: Вы итерацию по форме, поэтому вы должны проверить способность каждого из них (НЕ для одного @form)

<% @forms.each do |form| %> 
    ... 
    <% if can? :read, form %> 
    ... 
    <% end %> 
    <% if can? :update, form %> 
    ... 
    <% end %> 
<% end %> 

Изменения в способности:

can :read, Form # user can read all forms (not only own) 
can [:create, :update, :destroy], Form, :user_id => user.id # it is better to use `user_id` instead of `user` 

Это только один вариант, который должен работать должным образом, но это не испытанные мной :)

+0

Престола, это вещь. Он должен работать, но это не так. В настоящее время он просто скрывает все параметры, и я даже создал форму с текущим пользователем. Мне интересно, замечает ли он, что текущий пользователь создал форму. Кроме того: пользователь является атрибутом в моей форме, поэтому я изменил код, чтобы отразить это, но, к сожалению, не повезло. – Ryan

+0

Как я понимаю, у вас есть некоторые проблемы на странице ... Опубликовать свое мнение – gotva

+0

Я отредактирую исходное сообщение, чтобы уточнить. – Ryan

Смежные вопросы