Я недавно добавил свой проект в Codacy и получаю сообщение об ошибке в следующих строках кода (также в одной другой области, но мне кажется, что это проще всего понять):
def new
@arrangement = Arrangement.new
@arrangement.song_id = params[:song_id]
@song = Song.find(params[:song_id]) # This is the offending line
authorize @arrangement
end
Песня может иметь одну или несколько аранжировок, и song_id
передается в качестве одного из параметров в контроллер.ERD проекта:
Codacy говорит, что
Поиск с незаданной областью (и связанные методы) являются формой прямой ссылки на объект.Доступ к моделям, принадлежащим к другой модели, обычно должен осуществляться с помощью запроса с областью действия.
Например, если учетная запись принадлежит пользователю, это может быть небезопасная находка с незаданной областью
Iможно увидеть, как это было бы плохо, если находка ссылалась на учетную запись пользователя.В этом приложении ссылка @song
позволяет мне отображать название песни в представлении new
.
Будет ли лучше использовать вместо этого название песни?
Что-то построки:
def new
@arrangement = Arrangement.new
@arrangement.song_id = params[:song_id]
# Reworked code
song = Song.find(params[:song_id])
@song_title = song.name
@artist_name = song.artist.name
end
База кода на момент написания этой статьи находится на моей ветке github so_1 .
Та же проблема возникает еще в нескольких местах вВ моем проекте это был самый простой способ найти лучший способ структурировать мой проект.
Обратите внимание, что другие проблемы в SO и поисках Google, касающиеся поиска с незаданной областью, не отвечают на этот вопрос.