【问题标题】:Fighting Rails CRUD on one page在一页上与 Rails CRUD 战斗
【发布时间】:2012-01-31 07:29:28
【问题描述】:

我正在尝试在我的 rails 3.0 应用程序中构建一个稍微不寻常的编辑组件,其中包含页面顶部的记录选择器,以及页面后半部分的编辑表单,结果更多比我想象的要难。

顶部的记录选择器为您提供列表框中的记录列表和一个提交按钮,该按钮调用控制器中的编辑方法,该方法在记录 ID 上查找并返回索引页面。

before_filter :load

def index
end

def edit
  render :action => "index"  
end


def update
  if @project.update_attributes(params[:project])
    flash[:notice] = "Successfully updated project."
  end

  render :action => 'index'
end

def load
  @projects = Project.order("name asc")
  unless params[:id].nil?
    @project = Project.find(params[:id])
  else
    @project = Project.new
  end
end

从上面的代码可以看出,我不想在任何时候离开索引页面。

到目前为止一切正常,我可以选择一个项目,编辑信息,然后点击保存。

不幸的是,当调用 update 并呈现索引页面时,它没有将 params[:id] 返回给 index 方法,因此表单变为空白,即它不记得您正在编辑的项目。

我希望它保留此项目,因此您可以进行进一步更改,或在页面顶部选择其他项目。

我不确定如何处理 htis,或者我是否完全错误地处理了这个组件。

任何反馈将不胜感激:)

谢谢

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    我假设在index.html.erb 中,您使用的是select helper method 之一。这些方法有多种定义所选元素的方法,请查看您正在使用的方法的文档。如果需要,在update 方法中使用一个类实例变量来设置要选择的id,并在index.html.erb 中使用它。

    【讨论】:

      【解决方案2】:

      不幸的是,当调用 update 并呈现索引页面时,它没有将 params[:id] 返回给 index 方法,因此表单变为空白,即它不记得您正在编辑的项目。

      所以你正在更新@project。你打电话给render。所以在渲染index时,@project要么是一个新项目(如果没有设置params[:id])要么是一个现有项目。但是关于你在update 中的@project?如果params[:id] 为空白,您只需要保留它而不用Project.new 覆盖它。为什么不将负载过滤器更改为例如这? (未经测试)

      def load
          @projects = Project.order("name asc")
      
          unless @project
              unless params[:id].nil?
                  @project = Project.find(params[:id])
              else
                  @project = Project.new
              end
          end
      end
      

      如果您真的想依赖 params[:id],您可以将您的 render 替换为 redirect_to projects_path(:id => @project.id) 之类的东西,但是您会丢失项目对象中的错误信息,您可能会显示这些信息。

      【讨论】:

        猜你喜欢
        • 2011-03-18
        • 2015-09-27
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        • 2014-03-18
        • 1970-01-01
        相关资源
        最近更新 更多