2014-12-23 8 views
0

У меня есть рельсы проект со следующим:Рельсы, создающие объекты ассоциации: как передать информацию обратно другому контроллеру?

record.rb

class Track < ActiveRecord::Base 
has_many :records 
end 

track.rb

class Record < ActiveRecord::Base 
belongs_to :track 
end 

(Кстати, я имею в виду ассоциации этот путь, не нравится в музыкальной индустрии! В этом контексте трек похож на конкретный класс, и запись будет отдельным экзаменом. Каждый трек имеет несколько записей, каждая запись может принадлежать только одному треку и т. д.)

Затем в tracks/show.html.erb у меня есть список всех записей, относящихся к определенному треку. В нижней части, что я хочу иметь ссылку «Добавить», то есть что-то вроде

<%= link_to 'Add', new_record_path %> 

Я вполне Рельсы нуб и мне известно, что этот вопрос, вероятно, было предложено раньше. Тем не менее, я не знаю, как подать allthedifferent бит и кусочки информации там, где есть моя проблема. Я попытался прохождения трека в качестве аргумента в качестве такого

<%= link_to 'Add', new_record_path(@track) %> 

и определении метода new в records_controller.rb следующим

def new(track) 
@record = Record.new 
@record.track_id = track.id 
end 

, но я получил ошибку wrong number of arguments (0 for 1), который я думал, что сбивает с толку, так как я указал в контроллере new должен принять аргумент. Во всяком случае, я подозреваю, что этот метод неправильный или, по крайней мере, не-Ruby-like, поскольку во всех вопросах/учебниках, на которые я смотрел, ничего подобного не появилось. Я был бы признателен, если бы кто-нибудь объяснить, как я могу осуществить это прямолинейно (и функционально, конечно) ...

ответ

0

Вы можете передать это значение в ссылке, как это:

<%= link_to 'Add', new_record_path(track_id: @track.id) %> 

, а затем использовать его в records_controller.rb:

def new 
    @track = Track.find(params[:track_id]) 
    @record = Record.new(track_id: @track.id) 
    ... 
end 

Следующий шаг является то, что вам нужно иметь скрытое поле в вашей new форме, которая принимает, что track_id и отправляет его с другими атрибутами вашего метода create:

<%= f.hidden_field :track_id %> 

create метод не требует никаких шансов, если вы передаете track_id со всем другим Params к методу new. Просто проверьте, чтобы вы включили track_id в ваши разрешенные атрибуты в методе record_params.

Другим вариантом может быть настройка маршрутов записей как nested rescource. Я не знаю, имеет ли это смысл в логическом представлении вашей модели данных.

+0

Спасибо за ваше время ... Я сделал то, что вы сказали, но он не работает, когда я делаю запись, но track_id не сохраняется. (В строке '@record = ...' я переключил 'track.id' out на' @ track.id', который, как я полагаю, был опечаткой). есть ли что-то еще очевидное, что мне не хватает? –

+0

@ Thornshadow17432: Я обновил свой ответ следующим шагом, потому что вам нужно передать 'track_id' из формы обратно в метод' create'. – spickermann

+0

Спасибо! Скрытое поле сделало трюк. –

Смежные вопросы