2013-11-16 6 views
2

У меня есть Project и ProjectSetting модели со следующими ассоциациями:Pass @variable между контроллерами

class Project < ActiveRecord::Base 
    has_one :project_setting 
end 
class ProjectSetting < ActiveRecord::Base 
    belongs_to :project 
end 

В projects_controller у меня есть:

def show 
    @project = Project.find(params[:id]) 
    @project_setting = @project.project_setting 
end 

Поэтому я использую @project_setting форму в @project показать страницу, и я необходимо обновить @project_setting с этой страницы.

В project_settings_controller у меня есть:

def update 
    @project = Project.find(params[:id]) #problem is here 
    @project_setting = @project.project_setting 
    if @project_setting.update_attributes(params[:project_setting]) 
    respond_to do |format| 
     format.html { redirect_to project_path(@project) } 
     format.js 
    end 
    end 
end 

Но @project переменные в этих контроллеров не то же самое:

В projects_controller#show это Project с ID 26 и в project_settings_controller#update находит Project с ID 1

Поэтому мне нужно передать @project переменную от projects_controller#show до project_settings_controller#update.

Спасибо за помощь!

ответ

3

В вашем show.html.erb вы можете передать переменные обратно на любой контроллер. Например,

<%= link_to "Update project setting", 
    :controller => "project_settings", 
    :action => "update", 
    :project => @project %> 

отправит параметр «проект», заполненный переменной @project.

Если вы находитесь в виде тега, вы можете отправить переменную со скрытым полем тега:

<% hidden_field_tag("project", @project) %> 

Я надеюсь, что это помогает.

2

params[:id] в project_settings_controller содержали @project_setting.id Если вы хотите получить @project.id от Params, вы должны написать в routes.rb вложенной пути:

resources :projects do 
    resources :project_settings 
end 

И тогда project.id доступен в params[:project_id]. Пример: rails_guides