我有一个表单,通过remote =>向DB添加行.真正.然后我想把新的数据附加到表中,但是不能得到正确的渲染视图.
到目前为止,它正在渲染整个show.html.erb页面的新条目,但我想要布局一个最小版本作为添加.有一个快速的方式来告诉我的控制器在插入数据库后要渲染哪个视图?我想渲染我的部分命名_newly_added.html.erb
我的控制器
def new @task = Task.new render :partial => "/tasks/newly_added",:locals => { :t => @task } end
谢谢!!
编辑
我想我需要的只是另一种“展示”的观点.
我发现我需要改变的方法实际上是这样的:
def create @task = Task.new(params[:task]) respond_to do |format| if @task.save format.html { redirect_to @task,notice: 'Task was successfully created.' } format.json { render json: @task,status: :created,location: @task } else format.html { render action: "new" } format.json { render json: @task.errors,status: :unprocessable_entity } end end end
解决方法
根据您的问题的更改编辑.但是,没有什么真正的变化.你在想错了,需要调整你的想法.你不需要一个替代节目,你需要处理format.js请求.
部分应该在JavaScript响应中呈现,而不是控制器.控制器看起来更像这样:
def create @task = Task.new(params[:task]) respond_to do |format| if @task.save format.html { redirect_to @task,location: @task } format.js else format.html { render action: "new" } format.json { render json: @task.errors,status: :unprocessable_entity } format.js end end end
然后,在views / tasks / create.js.coffee
($'#mytable').append("<%= j render(partial: 'tasks/newly_added',locals: { t: @task }) %>")
这里发生的是浏览器调用create.js.控制器响应create.js模板,因为respond_to块的format.js. j转义_newly_added.html.erb文件的内容,并将其内容附加到表中.控制器不与现有视图进行交互,而是将JavaScript发送到浏览器,并与视图进行交互.
如果您使用像骨干或Ember这样的客户端MVC框架,这一切都会有所改变,但是您没有指定这一点,所以我假设您将使用库存Rails.