Генерируйте метод динамически, используя сильные параметры в Rails - PullRequest
0 голосов
/ 11 января 2019

Можно ли сгенерировать динамический метод, используя сильный параметр, который я получаю из моего представления?

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

show.html.erb

<div class="branch-names">
  <% @branches.each do |branch| %>
    <div>
     <%= image_tag "cat.jpeg" %>
     <%= link_to "#{branch.name} Posts", send("#{branch.branch}_posts_path") %>
   </div>
  <% end %>
</div>


posts_controller.rb

def self.define_category(name)
 define_method(name) do |params[:id]|
  @posts = Post.where(category_id = params[:id])
 end
end


define_category("#{params[:id]}")

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Для таких маршрутов, как /posts/cats, вам не нужно добавлять динамические методы. Думайте о branch как идентификатор категории:

маршруты:

resources :post_categories, only:[:index, :show]

вид:

...
<%= link_to "#{branch.name} Posts", post_category_path(branch.branch) %>

Контроллер PostCategories:

def show
  @posts = Post.where(category_id: params[:id])
end

Также вы можете сделать posts вложенным ресурсом по категориям и использовать более RESTful структуру с /post_categories/some_branch/posts отображением на posts#index

0 голосов
/ 11 января 2019

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

Вместо этого вы можете создать один метод, который имеет альтернативную переменную на params[:id], а затем решить, что показать пользователю:

class MyController
  def branches
    case params[:id]
    when('cat')
      do_cat_stuff
    when('dog')
     do_dog_stuff
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...