在一个页面上战斗Rails CRUD

时间:2012-01-31 07:29:29

标签: ruby-on-rails

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

顶部的记录选择器为您提供列表框中的记录列表和一个提交按钮,该按钮调用控制器中的编辑方法,该方法查找记录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方法,因此表单变为空白,即它不记得您正在编辑的项目。< / p>

我希望它能够持久保存这个项目,因此您可以进行进一步的更改,或者在页面顶部选择一个不同的项目。

我不确定如何解决这个问题,或者我是否完全错误地接触了这个组件。

非常感谢任何反馈:)

由于

2 个答案:

答案 0 :(得分:0)

我认为在index.html.erb中,您使用的是select helper method。这些方法可以定义所选元素,查看您正在使用的方法的文档。如果需要,请在update方法中使用类实例变量来设置要选择的ID,并在index.html.erb中使用它。

答案 1 :(得分:0)

  

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

所以你要更新@project。你正在呼叫render。因此,在呈现index时,@project是新项目(如果未设置params[:id])或现有项目。但是关于你@projectupdate的那个?如果Project.new为空,则只需保留该值,而不是使用params[:id]覆盖它。为什么不将负载过滤器更改为例如这个? (另)

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)的内容,但是您错过了项目对象中的错误信息,您可以显示。