Невозможно вызвать метод из представления - PullRequest
0 голосов
/ 19 июня 2020

Я не могу вызвать метод из контроллера Это представление

<% songartist = change_artist(songartist) %>
<%= @artistnum  %></b> total songs.

Это мой контроллер

 def mylist_artist
    @songs = current_user.songs.all
    @songartists = @songs.pluck(:artist).uniq

    def change_artist(link)

        require 'uri' 
        require 'open-uri' 
        require 'nokogiri' 

        @changed = URI::encode(params[:link]) 
        linkurl = "https://www.ufret.jp/artist.php?data="+@changed 
        doc = Nokogiri::HTML(open(linkurl)) 
        @artistnum = doc.xpath(" //a [@class= 'list-group-item list-group-item-action normal-chord']/strong").children.count
        return @artistnum 
    end 
end

Ответы [ 3 ]

3 голосов
/ 19 июня 2020

Я собираюсь сосредоточиться только на проблеме, указанной в вопросе «Невозможно вызвать метод из представления» ;

Вы не можете вызвать этот метод, потому что в контексте вы ' re (представление), этот метод недоступен без инициализации контроллера, в котором он определен. Вы можете добиться этого следующим образом:

<%= songartist = SomeController.new.mylist_artist('foo') %>

Предварительно обновив метод mylist_artist, добавив аргумент:

def mylist_artist(link)
  ...
end

Но вы никогда не должны этого делать, потому что мы обычно не таким образом напишите вложенные методы в Ruby. Как видите, единственное, что он возвращает, - это имя change_artist в качестве символа, который является возвращаемым значением этого метода.

Если вы планируете использовать change_artist в представлении слой, вы должны переместить его в помощник. Поскольку это норма, и Rails позволяет вам вызывать их без особых усилий.

Просто добавьте новый файл в свой каталог app/helpers/ и переместите туда метод:

# app/helpers/some_helper.rb
module SomeHelper
  def change_artist(link)
    ...
  end
end

Теперь, на ваш взгляд, вы можете просто сделать:

<% songartist = change_artist('foo') %>
1 голос
/ 19 июня 2020

Вы определяете метод внутри другого метода ...

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

1 голос
/ 19 июня 2020

Это не должно работать. Если вы действительно хотите вызвать такой метод в своих представлениях, вам придется поместить его в app/helpers/foo_helper.rb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...