2012-05-15 4 views
0

У меня есть модель принадлежности, которая позволяет публиковать объекты, которые будут проданы или арендованы на моем сайте. Недавно я изменил форму, сделав ее многоступенчатой: первая форма запрашивает имя объекта, а если объект продается или сдаётся в аренду, вторая форма запрашивает данные объекта, причем поля в зависимости от выбора пользователя ,Невозможно сохранить tag_list при использовании многоэтапных форм

Я использую is_taggable с Rails 3.0.5, и моя проблема в том, что tag_list никогда не сохраняется в базе данных, так как я переключился на многоэтапную форму (все остальные поля сохранены правильно).

Я следил за Ryan Bates Rails cast # 217.

Раньше я использовал: @belonging.tag_list = params[:belonging][:tag_list]

Так как я пошел от многоступенчатой, я использую: @belonging.tag_list = session[:belonging_params][:tag_list]

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

Вот «новое» и «создать» действие моего контроллера:

class BelongingsController < ApplicationController 
    before_filter :authenticate_user!, :except => [:index, :with_tag, :remove_tag] 
    after_filter :update_tag_cloud, :only => [:create, :update] 

    def new 
    @title = "Insert a new product or service" 
    @user = current_user 
    session[:belonging_params] ||= {} 
    session[:belonging_step] = nil 
    @belonging = @user.belongings.new(session[:belonging_params]) 
    session[:belonging_params][:tag_list] ||= [] 
    @belonging.current_step = session[:belonging_step] 
    render 'new' 
    end 

    def create 
    session[:belonging_params].deep_merge!(params[:belonging]) if params[:belonging] 
    @belonging = current_user.belongings.build(session[:belonging_params]) 
    @belonging.current_step = session[:belonging_step] 
    @belonging.tag_list=session[:belonging_params][:tag_list] 
    if params[:previous_button] 
     @belonging.previous_step 
     render 'new' 
    elsif params[:cancel_button] 
     session[:belonging_step] = session[:belonging_params] = nil 
     redirect_to user_path(current_user) 
    elsif params[:continue_button] 
     if @belonging.last_step? 
     if @belonging.save! 
      expire_fragment('category_list') 
      flash[:success] = "New product or service created!" 
      session[:belonging_step] = session[:belonging_params] = nil 
      redirect_to belonging_path(@belonging) 
     else 
      flash[:error] = "Object could not be saved" 
      render 'new' 
     end 
     else 
     @belonging.next_step 
     render 'new' 
     end 
    else 
     render 'new' 
    end 
    session[:belonging_step] = @belonging.current_step 
    end 

Много много спасибо за любую подсказку !!

ответ

0

Я действительно думал, что:

session[:belonging_params].deep_merge!(params[:belonging]) if params[:belonging] 

будет копировать все внутри PARAMS [: принадлежность], но, кажется, что Params [: принадлежность] [: tag_list] не был скопирован в сессии [: belonging_params] [: tag_list ], как я ожидал ...

Таким образом, проблема была решена путем добавления в акции «создать» новую переменную сессии:

session[:tag_list] = params[:belonging][:tag_list], чтобы иметь возможность сохранить :tag_list от шага формы к следующему.

session[:tag_list] определяется первым в 'новой' действия, как:

session[:tag_list] ||= []