使用多步表单时无法保存tag_list

时间:2012-05-15 18:56:59

标签: ruby-on-rails forms tagging multi-step

我有一个所属的模型,允许用户在我的网站上发布要出售或出租的对象。我最近更改了表单,使其成为一个多步骤形式:第一个表单询问对象的名称,如果对象是出售或出租,第二个表单询问对象的详细信息,字段取决于用户的选择

我正在使用is_taggable,使用Rails 3.0.5,我的问题是tag_list从未保存在数据库中,因为我切换到多步形式(所有其他字段都正确保存)。

我跟随Ryan Bates Rails演员#217。

之前,我正在使用:@belonging.tag_list = params[:belonging][:tag_list]

因为我从multistep开始,我正在使用:@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

非常感谢任何线索!!

1 个答案:

答案 0 :(得分:0)

我实际上是这么想的:

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

会复制params [:belongs]内的所有内容,但似乎没有像我预期的那样将params [:belongs] [:tag_list]复制到session [:belongs_params] [:tag_list]中......

所以通过在'create'操作中添加一个新的会话变量来解决问题:

session[:tag_list] = params[:belonging][:tag_list]能够将:tag_list从表单的一个步骤保存到下一个。

session[:tag_list]首先在“新”操作中定义为:

session[:tag_list] ||= []