Как мне правильно использовать принадлежащие_самую и has_many? - PullRequest
2 голосов
/ 08 января 2011

Я отлаживал это весь день.У меня есть две модели в моем приложении: чайКласс и чай.В файле tealass.rb у меня есть

has_many :teas

В файле tea.rb у меня есть файл "own_to: kettlelass".

Я пытаюсь сделать URL-адрес похожим на "..teaclasses/:id/teas/:id";1007 *, я положил before_filter :get_teaClass

def show
@tea = @teaclass.teas.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.xml  { render :xml => @tea }
end
end

def new
if @teaclass.teas
    @tea = @teaclass.teas.new
    @teaclass.teas << @tea 
    #@tea = Tea.new
    else
        flash[:notice=>"failed"]
        @tea = Tea.new 
        @teaclass.teas << @tea 
    end
respond_to do |format|
  format.html # new.html.erb
  format.xml  { render :xml => @tea }
end
end

def get_teaClass
    begin
        @teaclass = Teaclass.find(params[:teaclass_id])rescue
        redirect_to teaclass_path, :notice => "Teaclass Required!"
    end
 end

Но я продолжаю получать сообщение об ошибке "неизвестный атрибут: kettlelass_id"

/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2906:inassign_attributes'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2902:in `each'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2902:in `assign_attributes'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2474:in `initialize'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:380:in `new'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:380:in `send'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:380:in `method_missing'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2178:in `with_scope'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_proxy.rb:207:in `send'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_proxy.rb:207:in `with_scope'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:376:in `method_missing'
/home/jianpchen/repo/Teashop/app/controllers/teas_controller.rb:31:in `new'

Может кто-нибудь помочь мне в этом?Спасибо.

Ответы [ 2 ]

3 голосов
/ 08 января 2011

Я пытаюсь сделать URL-адрес похожим на это "..teaclasses /: id / teas /: id";поэтому в teas_controller.rb я помещаю before_filter: get_teaClass

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

Что вам нужно сделать, это на самом деле добавить внешний идентификатор в базу данных.Поэтому проверьте schema.rb и убедитесь, что столбец существует.

Вот что вам нужно сделать.

  1. Убедитесь, что в таблице базы данных действительно есть иностранец tea.
  2. Если вы перейдете кследующий шаг, где я покажу вам лучший способ написания вашего кода.
  3. Если у вас нет 'tea_class_id' в качестве целочисленного значения в вашей таблице 'чай', вам нужно добавить его.
  4. скрипт / генерация миграции add_tea_class_id_to_tea
  5. rake db: migrate
  6. Теперь вот как должен быть написан ваш код

rout.rb

map.resources :teas
map.resources :teas_classes

Модели

модели / tea.rb

class Tea < ActiveRecord::Base
    belongs_to :tea_class
end 

tea_class.rb

class TeaClass < ActiveRecord::Base
    has_many :teas
end 

контроллеры

teas_controller.rb

def new
   @tea = Tea.new
end

def show
  @tea = tea.find(params[:id)
end

def create
    @tea = Tea.new(params[:tea])
    if @tea.save
        redirect_to teas_path
    else
        render :action => 'new'
    end
end 

просмотров

Это действительно важно.Убедитесь, что вы передаете: tea_class_id в качестве параметра при создании чая, иначе он не знает, как создать ассоциацию.Это своего рода за сценой, потому что вы отправляете params[:tea], но именно в тех параметрах, куда на самом деле отправляется tea_class_id.

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

new.html.erb

<% form_for(@tea) do |t| %>
    <%= t.collection_select :tea_class_id TeaClass.all, :id, :name %>
<% end %>

Убедитесь, чтоу вас есть классы чая, чтобы заполнить метод collection_select.Google, что плюс rails api, если вы не понимаете, что происходит.

Вложенные маршруты (на стороне)

Похоже, вы пытались получить маршруты вроде teaclasses/:id/teas/:id.Это называется вложенной маршрутизацией, и вы захотите настроить ее в вашем маршруте. Rb

map.resources :tea_classes_ do |tea_classes|
   tea_classes :teas
end
map.resources :teas

Затем вы можете установить ссылку на teas_classes/pour/teas/chinese.Вы должны знать эту команду rake routes.Это поможет вам понять, как работают пути.

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

<%= link_to "Teas", tea_classes_teas_path(@tea_class)%>

Вам необходимо указать @teas, чтобы сделатьссылка, потому что она берет идентификатор от этого, и когда вы щелкаете, она передает его teas_controller' as params [: teas_class_id] `.Вам не нужно ничего делать без.Это будет автоматически в URL.

0 голосов
/ 08 января 2011

Если вы посмотрите на свои журналы, вы увидите, что содержит параметры. Учитывая ваш код и объяснение, в параметрах нет ключа teaclass_id. Скорее всего, вы ищете: id. Если вы хотите получить доступ:

match 'controller/:teaclass_id' => 'controller#show'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...