2014-10-19 1 views
0

У меня есть почтовая система, где все пользователи в той же группе могут видеть одно и то же сообщение и редактировать одно и то же сообщение. Но у меня проблема с тем, если я, например, редактирую сообщение, а мой друг редактирует одну и ту же запись, то либо я, либо мой друг потеряют изменение, которое мы только что сделали, и только последний контент сохранил их счет.Права на страницы, группа пользователей ROR

Так что мой вопрос: Есть ли способ, которым я могу ограничить двух пользователей из одной группы, чтобы увидеть тот же пост вовремя. Так что, если я, например, редактирую сообщение, а мой друг нажимает edit на сообщении im, он получит сообщение (Nicolai редактирует этот пост, дождитесь его завершения), и когда я покину страницу редактирования, он и другие из та же группа, в которой я нахожусь, сможет снова отредактировать сообщение. Но только по одному.

Я использую Ruby on rails 4 и разработал для регистрации пользователя.

Я понятия не имел, как это сделать. Надеюсь, кто-то может дать мне идею или вдохновение, чтобы это сделать.

Заранее спасибо.

ответ

1

Я думаю, что вам, возможно, придется взглянуть на оптимистический и пессимистический замок с Active Record: http://api.rubyonrails.org/classes/ActiveRecord/Locking/Optimistic.html

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

простым решением было бы установить флаг (столбец в db), который установит блокировку записи. вы обновляете блокировку при доступе к странице редактирования и очищаете ее при сохранении. как это звучит?

+0

Этот звук интересный. Я буду демонстративно читать об этом. Спасибо за ссылку. Но скоро у меня будет другое решение. Там будет предупреждать нового пользователя, если пользователь все готов на странице. – niiicolai

0

Если у вас есть подписка на railscasts, то это хороший ресурс для оптимистической блокировки. Это не совсем то, что вы хотите, но менее навязчивая альтернатива optimistic locking

Другим вариантом будет pessimistic locking. Это позволит вам использовать активную запись для фактической блокировки записи db. Затем вы можете проверить блокировку этой записи, чтобы отключить кнопку редактирования (или что-то подобное). Это будет больше работы для выполнения, но звучит как пессимистическая блокировка - это то, что вы хотели бы.

+0

Спасибо за совет. – niiicolai

0

SASS для edit.html.haml

.editingback 
    position: absolute 
    width: 100% 
    height: 102% 
    background: rgba(0, 0, 0, 0.3) 
    z-index: 500 
    display: none 

.editing 
    z-index: 501 
    width: 300px 
    height: 150px 
    background: #eee 
    border: 1px solid #adadad 
    border-radius: 3px 
    position: absolute 
    top: 40% 
    left: 50% 
    transform: translate(-50%, -50%) 
    box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.5) 
    font-family: $la 
    padding: 15px 
    text-align: center 
    font-size: 13px 
    display: none 

#editing_button 
    border: 1px solid #eee 
    background: #383838 
    color: white 
    padding: 7px 

edit.html.haml

.editingback 
.editing 
    = @post.state 
    is editing this post at the moment, please try again later! 
    %br 
    %br 
    = link_to 'OK', posts_path, id: 'editing_button' 

= form_for (@post) do |f| 
    = f.text_field :title 
    = f.text_area :content 
    = f.submit 'Create' 

:javascript 
    var pageid = '<%= @post.id %>'; 
    var statevalue = '<%= @post.state %>'; 
    var currentuser = '<%= current_user.email %>'; 

    window.onload = checkstate(); 


    function checkstate() { 
    if (statevalue == "") { // If statevalue is equal to "" it will send a ajax request to the updatestate action with the posts id. // 
    $.ajax({ 
     url : '/posts/changestate/' + pageid, 
     type : 'POST', 
     data : $('#changenotestate').serialize(), 
    }); 
    window.onbeforeunload = removestate; // When the user leave the site will it run the removestate function to remove state // 
    } else if (statevalue != currentuser) { // If a new user enter the page after you and the statevalue not is equal to the currentuser, show the warning // 
    $(".editingback").show(); 
    $(".editing").fadeIn(2000); 
    } else { 

    } 
    }; 

    // A function there will send a ajax request to the removestate action // 
    function removestate(){ 
    $.ajax({ 
     url : '/posts/removestate/' + pageid, 
     type : 'POST', 
     data : $('#changenotestate').serialize(), 
    }); 
    }; 

posts_controller.rb

def edit ## Edit post action 
    @post = Post.find(params[:id]) 
end 

def update ## Update post action 
    @post = Post.find(params[:id]) 
    @post.update(post_params) 
    if @post.save 
    redirect_to posts_path 
    else 
    render 'edit' 
    end 
end 

def updatestate ## Action there will add current_user.email to the state field 
    @post = Post.find(params[:id]) 
    @post.update(:state => current_user.email) 
    redirect_to :back 
end 

def removestate ## Action there will remove current_user.email to the state field 
    @post = Post.find(params[:id]) 
    @post.update(:state => '') 
    redirect_to :back 
end 

routes.rb

resources :posts # RESTFULL ROUTES 
post '/posts/changestate/:id' => 'posts', :action => 'updatestate' #ROUTE TO UPDATE POST STATE 
post '/posts/removestate/:id' => 'posts', :action => 'removestate' # ROUTE TO REMOVE POST STATE 

стол переговоров имеет следующие поля:

Id, Title, Content, State.


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

Таким образом, пользователь может просто использовать функцию «элемент управления» браузера, чтобы удалить предупреждение. Поэтому я рассмотрю «пессимистическую блокировку», чтобы сделать ее безопасной.

Наслаждайтесь .. и, пожалуйста, скажите мне, если вы знаете лучший способ.

0

Я думаю, вы можете взглянуть на semaphores и они implementation in Ruby with Redis.

Используя этот адрес, вы можете ограничить доступ к одному пользователю одновременно (однако вам нужно будет написать всю логику самостоятельно) - redis дал вам довольно хороший инструмент, atomic operations.

+0

Выглядит очень интересно. Большое спасибо! – niiicolai

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