2014-10-29 3 views
1

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

Есть ли способ ускорить это? А также это, как профессионал мог бы это сделать?

Контроллер

def mark_read 
    @topic = Topic.find(params[:id]) 
    @topic.mark_as_read! :for => current_user 
    redirect_to user_path(current_user.slug) 
end 

def mark_all_read 
    Topic.mark_as_read! :all, :for => current_user 
    redirect_to user_path(current_user.slug) 
end 

Маршруты

resources :users do 
    member do 
    post :mark_read 
    post :mark_all_read 
    end 
end 

Посмотреть

<% if current_user.id == @user.id %> 
<%= link_to "Mark all as read", mark_all_read_user_path, :method=> :post %> 

<h4> List of posts unread by you </h4> 
<% @unread.each do |topic| %> 
<% if @user.following?(Product.find(topic.product_id)) %> 
<li> <%= topic.title %> <%= link_to "Mark as read", mark_read_user_path(topic), :method=> :post %> </li> 
<% end %> 
<% end %> 

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

+0

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

+0

@Swaathi У меня такой же вопрос. Я работал с cakephp, и когда вы создаете действие 'show_all' в контроллере' Car' inmediatelly, у вас есть путь 'localhost/Car/show_all' ... Я смотрю что-то вроде этого в rails – inye

+0

@ mohameddiaa27« mark_read »и «mark_all_read» - это действия в пользовательском контроллере. И это представление - страница показа пользователей. Меня просто беспокоило, нужно ли мне создавать маршрут каждый раз, когда мне нужно получить доступ к действию. Я чувствую, что это делает приложение очень уязвимым, так как схема URL разоблачена. –

ответ

0

Ответ на ваш вопрос: нет. Вы не можете иметь доступ к любому в контроллере, если он не имеет маршрут, или сво CRUD генерироваться по умолчанию, например:

resources :articles 

генерирует

Controller#Action 
    articles GET /articles(.:format)   articles#index 
      POST /articles(.:format)   articles#create 
new_article GET /articles/new(.:format)  articles#new 
edit_article GET /articles/:id/edit(.:format) articles#edit 
    article GET /articles/:id(.:format)  articles#show 
      PATCH /articles/:id(.:format)  articles#update 
      PUT /articles/:id(.:format)  articles#update 
      DELETE /articles/:id(.:format)  articles#destroy 
+0

«mark_read» и «mark_as_read» имеют маршруты и соответствующие действия в контроллере. Я просто не хочу создавать маршрут каждый раз, когда мне нужно получить доступ к действию в контроллере. –

+0

Фактически, единственная работа по сокращению пользовательских маршрутов - это сопоставление каждого действия с его типом CRUD, в этом случае «mark_read» можно заменить обновлением. Но это не лучшая практика, маршруты - это открытые двери для вашего приложения, они выставляют методы для действий, а значит - для безопасности. – mohameddiaa27

+0

Но если они выставляют URL-адрес и имя действия не попадают в систему безопасности? Это сделает его более уязвимым? –

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