在Ruby on Rails中,提交按钮不会返回到索引

b0zn9rqh  于 2023-06-05  发布在  Ruby
关注(0)|答案(1)|浏览(152)

我是Ruby on Rails的新手,我试图找出我的代码失败的地方。我创建了一个Articles表,所以当我去articles/new的时候,如果我点击提交按钮后有视图来创建文章,它不会去/articles,而是在终端,它显示了一个帖子请求。
我创建了一个表articles和Model Article沿着article_controller类,还在路由中添加了资源:articles
但是当我访问articles/new并使用表单创建新的article时,我可以看到由于article_path上的POST请求,控制器中的create fn被调用(/articles/)(因为我尝试将文章保存到db中,它确实被保存了)但是当我尝试使用render plain: @articles.inspect显示文章详细信息时,什么也没有发生,即使在点击提交按钮后,它仍然在/articles/new上。(即使create fn为空,它也会停留在该页面上)。请救救我!
控制器

class ArticlesController < ApplicationController
    def show
        @article = Article.find(params[:id])
    end
    def index
        @articles = Article.all()
    end
    def new

    end
    def create
        render plain: @article.inspect
    end
end

型号

class Article < ApplicationRecord
    validates :title, presence: true, length: {minimum: 3, maximum: 50}
    validates :description, presence: true, length: {minimum: 10, maximum: 100}
end

新建表单

<h1>Create an Article <h1>
<%= form_with scope: :article, url: articles_path, method: :post, local: true do |f| %>
    <p>
        <%= f.label :title %><br/>
        <%= f.text_field :title %>
    </p>
    <p>
        <%= f.label :description %><br/>
        <%= f.text_area :description %>
    </p>
    <p>
        <%= f.submit %>
    </p>
<% end %>

索引页

<h1>Showing All Articles</h1>

<table>
    <thead>
        <tr>
            <th>Title</th>
            <th>Description</th>
            <th>Action</th>
        </tr>
    </thead>
    <tbody>
        <% @articles.each do |article|%>
            <tr>
                <td><%= article.title%></td>
                <td><%= article.description%></td>
                <td>PlaceHolder</td>
            </tr>
        <% end %>
    </tbody>
</table>
ar5n3qh5

ar5n3qh51#

我不能完全复制你的问题,但我认为你正在追求一个错误的方法,因此我张贴一个答案。
对于create操作为空的场景,浏览器将停留在articles/new页面上是预期的行为,因为它没有得到renderredirect响应,所以它没有什么可做的。
对于create呈现render plain: @article.inspect的场景,我希望它呈现带有文本“nil”的空页面,它做到了。这是因为@article从未被初始化,并且示例变量不会引发未定义变量错误,而是返回nil。所以我无法复制你的确切行为(停留在页面上),如果你想花更多的时间在浏览器中检查响应。
然而,作为初学者,你不应该手动创建你的模型,视图,控制器,而是使用脚手架。通过这种方式,您将在创建到您的文章的详细信息后获得重定向的工作示例,并且通过在重定向URL中的简单更改,您可以使其转到索引页面。

class ArticlesController < ApplicationController
    
  # ...

  def create
    @article = Article.new(article_params)

    respond_to do |format|
      if @article.save
        # here I replaced the scaffolded `article_url(@article)` with `articles_url`
        format.html { redirect_to articles_url, notice: "Article was successfully created." }
        format.json { render :show, status: :created, location: @article }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @article.errors, status: :unprocessable_entity }
      end
    end
  end

  private
  def article_params
    params.require(:article).permit(:title, :description)
  end
end

相关问题