2012-01-28 5 views
0

У меня возникли проблемы передачи параметры Мое приложение, которое настроено так:Передача параметры для вложенных отношений

Fact belongs_to Source 
Source has_many Facts 

Источник вложен под пользователем в маршрутах

Я использую факты формирование для создания Источник данных. Таким образом, у меня есть методы получения и установки в Фактов модели, как это:

def source_name 
    source.try(:name) 
end 

def source_name=(name) 
    self.source = source.find_or_create_by_name(name) if name.present? 
end 

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

У меня есть скрытое поле с user_id в форме, но user_id все еще установлен. Каков самый простой способ передать и сохранить user_id, чтобы установить вложенные отношения?

Вот метод создания контроллера Источник:

def create 
    @user = User.find(params[:user_id]) 
    @source = @user.source.build(params[:source]) 
... 
end 
+0

Добавить свое действие вашего контроллера в свой вопрос – Uchenna

+0

Не уверен, правильно ли я понимаю, но разве вы не должны или не могли бы установить источник через пользовательскую модель? Как user.source = xxx – three

+0

У меня есть мультимодельная форма под моделью Facts. Я попытался установить Источники из формы с регулярными вводами и используя поля_for. Кажется, я не могу заставить его сохранять user_id в любом случае. Надеюсь, это имеет смысл. – Scott

ответ

0

Я думаю, проблема заключается в том, что вы создаете источник непосредственно из метода setter в модели Fact. Если вы не установили цепочку, используя что-то вроде сборки в FactController, user_id не будет установлен. То, что вы делаете в SourceController, должно выполняться и в FactController. Кроме того, кажется, что идентификаторы установлены только для непосредственного родителя при использовании команды сборки. Вы можете попробовать что-то, как показано ниже:

def create 
    @source = current_user.sources.find_or_create_by_name(params["source_name"]) 
    @fact = @source.facts.build(:user_id => @source.user_id) 
    .... 
end 

Надеюсь, что это поможет.

0

Если пользователь имеет один Source, попробуйте выполнить следующие действия в качестве create() метода:

def create 
    @user = User.find params[:user_id] 
    @user.source = Source.new params[:source] 

    if @user.save 
    redirect_to @user, :flash => { :success => "Source updated!" } 
    else 
    flash[:error] = "Failed to update the source!" 
    render :action => "new" 
    end 
end 

Создание в Source как атрибут на объекте User, а затем сохранить объект User должен автоматически ассоциировать Source с User ,

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