Rails 3.2, вложенный ресурс, неинициализированная константа - PullRequest
1 голос
/ 24 марта 2012

У меня проблема с Rails 3.2.1, вложенный ресурс продолжает жаловаться на неинициализированную константу, я не могу понять почему, потому что мне кажется, что я сделал то же самое, что и с другой моделью, где этосделал работу.В какой-то момент я подумал, что могу где-то использовать зарезервированное слово, но изменение названий моделей не помогло ...

Ошибка:

uninitialized constant Brand::Series
Extracted source (around line #11):

8: </article>
9: 
10: 
11: <% @series.each do |serie| %>
12:     <article class='serie_block'>
13:         <%= serie.name %>
14:     </article>

brand.rb

class Brand < ActiveRecord::Base
   has_many :series, :order => "name, id ASC", :dependent => :destroy
end

serie.rb

class Serie < ActiveRecord::Base
    belongs_to :brand
end

brands_controller.rb

def show
  @brand = Brand.find(params[:id])
  @series = @brand.series
end

brands / show.html.erb

<% @series.each do |serie| %>
 <article class='serie_block'>
    <%= serie.name %>
 </article>
<% end %>

Я получаю ту же ошибку "неинициализированная константа Brand :: Series" при попытке создать новую серию, но затем онассылается на "app / controllers / series_controller.rb: 21: in` new '", то есть эту строку" @serie = @ brand.series.build ".

series_controller.rb

# GET /Series/new
# GET /Series/new.json
def new
    @brand = Brand.find(params[:brand_id])
    @serie = @brand.series.build

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @serie }
    end
end

Теперь странно то, что отношение, кажется, работает, Rails не жалуется на то, что у "брендов" нет метода "серии".Но фактическое создание объекта серии кажется неудачным: s

1 Ответ

1 голос
/ 24 марта 2012

В вашем отношении has_many в Brand вы используете символ, представляющий множественное название вашей модели (как и должно быть). Rails теперь должен найти подходящий класс модели по этому символу. Для этого он примерно выполняет следующие действия:

relation_name = :series # => :series
class_name = relation_name.singularize.classify # => "Series"
class_object = class_name.constantize # in the context of the Brand class: => Brand::Series

Таким образом, виновник лежит в методе Rails singularize , который не может получить «правильную» форму единственного числа series. Если бы все сработало так, как вы ожидали, class_name было бы "Serie" (обратите внимание на отсутствующий s в конце).

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

class Brand < ActiveRecord::Base
  has_many :series, :class_name => "Serie", :order => "name, id ASC", :dependent => :destroy
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...