【问题标题】:Rails form redirections for new/create, edit/updateRails 表单重定向用于新建/创建、编辑/更新
【发布时间】:2011-02-01 02:20:27
【问题描述】:

我使用的是 Rails 2.3.8

我遇到了表单出错后呈现的操作的问题。

所以我有一个posts 控制器和常规相关操作indexnewcreateeditupdateshow

以下是PostsController 中带有表单的操作:

def new
  @post = Post.new
  # other setup
end

def create
  if request.post?
    @post= Post.new(params[:post])
    # other setup for save
    if @post.save
      flash[:notice] = 'Post was successfully created.'
      redirect_to campaign_path(@post, :redirect => "create")
    else
      render :action => 'new'
    end
  end 
end

def edit
  @post = Post.find(params[:id])
  # other setup
end


def update
  # setup for save
  if @campaign.update_attributes(params[:post])
    flash[:notice] = 'Your post was successfully updated.'
    redirect_to :action=> "index"
  else
    render :action => "edit"
  end
end

这是视图中的表单

new.html.erb:

<% form_for(@post, :html => {:multipart => true}) do |f| %>
  <%= f.error_messages %>
  # Form fields and stuff
  <%= f.submit "Create New Post" %>
<% end %>

edit.html.erb:

<% form_for(@post, :html => {:multipart => true}) do |f| %>
  <%= f.error_messages %>
  # Form fields and stuff
  <%= f.submit "Update This Post" %>
<% end %>

我的问题是:如果我在 new 页面上出现错误(例如,将字段留空),则呈现的视图会提交到错误的位置。因此,如果我从new 开始并多次提交均未成功,我将依次通过newcreateeditupdate 操作。所以行为是:

开始创建帖子:

操作:new
URI:/posts/new
渲染视图:new
提交成功到:show
提交失败到:create

第一次提交失败后:

操作:create
URI:/posts 不好?
渲染视图:new
成功提交到:index(这意味着表单正在提交到 update 操作,错误
不成功的提交到:edit bad

第二次提交失败后:

操作:edit 糟糕,我应该无法从 new 到达这里!
URI:/posts/[id]
渲染视图:edit 糟糕,我应该无法从new 到达这里!
成功提交到:index通过更新
提交失败到:update

第三次及以后的不成功提交后:

操作:update 糟糕,我应该无法从new 到达这里!
网址:/posts/[id]
渲染视图:edit 糟糕,我应该无法从new 到达这里!
提交成功到:index
提交失败到:update

如果有人能指出我做错了什么,我将不胜感激。如果您需要任何其他信息,请询问。

非常感谢!

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    问题可能是您用于创建帖子的代码(# setup for save)。您可能正在设置@post.id,这导致您的新表单提交更新而不是创建。 form_for 助手检查记录是否是新的,如果是新的则提交创建,如果已存在则提交更新。

    注意:你也不需要检查request.post?在您的创建操作上。创建操作应始终是发布请求。

    【讨论】:

    • 我在create 中添加了一行,这是我为保存所做的设置的要点,即@post = Post.new(params[:post]) 我也做了一个update_attribute。我不需要打电话Post.new 来保存它吗?澄清一下,我没有在任何地方明确指定id,尽管我想在某个时候会自动创建一个。
    • 如果您调用 update_attribute,您的帖子有可能会保存在那里。您的第一个检查应该是 update_attribute 没有成功 - 如果成功,那么您正在执行更新而不是在您的下一个操作中创建。
    • 你说得对。当我创建新帖子时,我删除了更新属性并将更改折叠为参数哈希上的merge!,它现在按预期工作。非常感谢!
    【解决方案2】:

    你的路线是什么样的?

    正如潘所说,如果不是post?,则不需要request.post?,尤其是没有else 的情况下进行捕获

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      相关资源
      最近更新 更多