我正在尝试在我的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>
我希望它能够持久保存这个项目,因此您可以进行进一步的更改,或者在页面顶部选择一个不同的项目。
我不确定如何解决这个问题,或者我是否完全错误地接触了这个组件。
非常感谢任何反馈:)
由于
答案 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]
)或现有项目。但是关于你@project
中update
的那个?如果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)
的内容,但是您错过了项目对象中的错误信息,您可以显示。