2017-02-19 2 views
1

В представлении (index.html.erb), у меня есть список всех моих статей:Настройка параметров с точки зрения (лучшие практики)

<% @articles.each do |article| %> 
... 
<%= link_to 'Show', article_path(article) %> 
<%= link_to 'Edit', edit_article_path(article) %> 
<%= link_to 'Delete', article_path(article), method: :delete, data: { confirm: 'Are you sure?' } %> 
... 
<% end %> 

И я хотел бы сделать ссылку (т.е. только админы), где администратор может установить атрибут «незаконный» в качестве атрибута true/false. Что-то в этих строках:

<% if current_user.try(:admin?) %> 
<%= link_to "Mark as illegal", article, :method => "set_article_as_illegal" %> 
<% end %> 

Это, очевидно, не работает. Но я не знаю, как это сделать, наилучшим образом. Единственный способ, о котором я могу думать, действительно неуклюжий (вариант В ниже).

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

A) Создание двух помощников-функции, как, например:

def set_article_as_illegal(article) 
    article.update_attribute :illegal, true 
end 

def set_article_as_legal(article) 
    article.update_attribute :illegal, false 
end 

И как-то называть их, как например:

<%= link_to "Mark as illegal", article, :method => "set_article_as_illegal" %> 

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

B) Создание нового контроллера (или их нескольких) для его выполнения.

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

  • Создание маршрута: get '/make_article_illegal', to: 'article#make_illegal'
  • Создание другой маршрут: get '/make_article_legal', to: 'article#make_legal'
  • Создание контроллера make_illegal, который обрабатывает, что делает его незаконным.
  • Создание другого контроллера make_legal, который делает его законным.

Но это, похоже, неловко.

Должно быть очевидный способ сделать это, что мне не хватает.

ответ

2

Есть бесконечные (почти) способы сделать это, конечно. Один из способов.

# routes.rb 
get '/update_article_legality/:id/:illegal' => 'article#update_legality', as: :update_article_legality 

# in the view 
= link_to 'Make legal', update_article_legality_path(id: article.id, illegal: 'false') 
= link_to 'Make illegal', update_article_legality_path(id: article.id, illegal: 'true') 

# in controller 
def update_legality 
    article = Article.find(params[:id]) 
    illegal = params[:illegal] == 'false' ? false : true 

    article.update_attribute :illegal, illegal 
end 

Другой способ и больше из MVC один является на самом деле создать два контроллера с только один метод каждого обновления законности. Возможно, это слишком много для вашей ситуации, но это, по крайней мере, теория.

# app/controllers/article/illegal_controller.rb 
class Article::IllegalController < ApplicationController 
    def update 
    article = Article.find(params[:id]) 
    article.update_attribute :illegal, false 
    end 
end 

# app/controllers/article/legal_controller.rb 
class Article::LegalController < ApplicationController 
    def update 
    article = Article.find(params[:id]) 
    article.update_attribute :illegal, true 
    end 
end 

# routes.rb 
get '/make_article_legal' => 'article/legal#update', as: :make_article_legal 
get '/make_article_illegal' => 'article/illegal#update', as: :make_article_illegal 

# in the view 
= link_to 'Make legal', make_article_legal_path(id: article.id) 
= link_to 'Make illegal', make_article_illegal_path(id: article.id) 

PS: Я не проверял этот код, так что может быть нечетным орфографическая ошибка, но она работает по крайней мере теоретически.

Есть интересная статья по этому вопросу .

+1

Спасибо за ответ.Я получаю эту ошибку, когда я реализую ваше (первое) решение: >> Нет сопоставлений маршрутов {: action => "update_legality",: controller => "articles",: id => 24,: negative => false} missing required ключи: [: незаконно] << ... Если я изменю маршрут на >> get '/ update_article_legality' << (для целей отладки), тогда страница загружается, и я вижу, что ссылка «Сделать законную» ссылки на это: 'update_article_legality? id = 24 & negative = false'. Но я не могу исправить ошибку. : -/Вы знаете, что делать здесь? – Zeth

+2

Да, конечно, извините, это то, что происходит, когда вы не можете проверить свой код. См. Мое обновление. Это потому, что вы не можете передавать логические значения в 'link_to'. Вот почему я предпочел бы второе решение. – Iceman

+1

Это работает! Большое спасибо. – Zeth

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