Rails 3中的持久变量

时间:2010-11-27 01:40:07

标签: ruby-on-rails ruby ruby-on-rails-3

def edit
    @title ="Edit account"
    @page_name = "edit"    
  end

  def update
    if @wsp.update_attributes(params[:wsp])
      # it worked
      flash[:success] = "Profile updated."
      if (@title == "Location")
        redirect_to wsp_location_path
      else
        redirect_to edit_wsp_path
      end
    else 
      @title = "Edit account"
      render 'edit'
    end
  end

在update方法中,变量@title为空。如何让@title持久化,以便我可以阅读它?

3 个答案:

答案 0 :(得分:3)

每个控制器操作都在单独的请求中执行,因此您将丢失两者之间的值。

您可能需要使用session,或者更好的是flash来跨请求存储标题。

def edit
  flash[:title] = @title = "Edit account"
  ...
end

def update
  ...
  if (flash[:title] == "Location")
    redirect_to wsp_location_path
  else
    redirect_to edit_wsp_path
  end
end

答案 1 :(得分:0)

edit操作中,您应该将结果写入表单字段,可能是隐藏字段。然后在update操作中从提交的表单中重新读取该数据。你真的不应该在这两个请求之间保留任何状态服务器端。

虽然您可以使用会话,但我会建议不要这样做。过度使用会话以在请求之间传递少量短期数据通常是不好的形式。

答案 2 :(得分:0)

如果这样做的目的是在编辑页面上显示它,为什么不把它放在那里(app/views/the_controller/edit.html.erb)?这样它就会显示在该页面的所有请求上,并且您不会将视图/演示文稿代码放入不属于它的控制器中。