【问题标题】:How are params passed from the New to Create action in Rails?在 Rails 中,参数是如何从 New 传递到 Create 动作的?
【发布时间】:2015-10-09 19:41:17
【问题描述】:

据我所知,rails 表单的 new 操作通常会实例化模型并提供带有允许参数输入的视图。

def new
  @post = Post.new
end

我不明白用户提交的相同信息是如何传递到create 操作中的Post.new 方法的:

def create
  @post = Post.new(post_params)
  ...
end

尽管发生了页面刷新,rails 如何将这些参数引导到create

【问题讨论】:

    标签: ruby-on-rails rest model-view-controller controller


    【解决方案1】:

    您正在混合两个请求。当您点击new 操作时,将呈现包含您的form 的视图。当它被渲染时,new 动作完成,现在new 动作与create 动作无关。

    您需要new 操作来创建formform_for 方法,在该方法中您实际传递一个对象,在您的情况下为@post

    create动作是独立的,它接收的paramsnew方法无关,那些params是通过视图的new.html.erb文件中渲染的form接收的.

    您还可以在控制器中调用create 方法,方法是通过 AJAX 发送数据,甚至使用 cURL 或 POSTMAN(Chrome 扩展程序)。

    正如你所问:

    尽管发生了页面刷新,rails 如何引导这些参数来创建?

    Rails 不引导这些params,Rails 在后端运行,Rails 只接收那些params。它们是通过 HTML 表单发送的,正如我之前所说,还有其他方法可以发送 params

    【讨论】:

    • 如果是这种情况,为什么不是Post.create(post_params) vs Post.new(post_params)?
    • def create 中应该是Post.create post_params 而不是Post.new,在大多数简单的情况下就是这样。 Post.create ... 将保存对象并对数据库进行 SQL 调用以将新记录插入到 posts 表中。 Post.new ... 只会创建一个新对象并使用指定的参数加载它。您必须在该项目上调用 @post.save 才能将其保存到数据库中。
    • 因为您没有在新方法中收到params,所以您也不应该这样做。请记住new 方法和create 方法是独立的。您只需在 new 方法中执行 Post.new 即可获得 @post 对象,然后将 @post 传递给您的视图并将其发送到 form_for - 这样form_for 知道哪种您正在谈论的对象,以及它应该具有哪些属性。
    • 您甚至可以为您的new 方法删除Post.new,并且在您的视图文件:new.html.erb 中,您可以将原始HTML 传递给表单,它会完美运行。
    • @CarlEdwards 你是对的,但即使使用create 方法,如果属性无效,create 方法也不会调用任何数据库函数。仅当对象有效时才会将对象写入数据库,无论您通过savecreate 将其持久化。
    猜你喜欢
    • 2012-11-07
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多