Techioz Blog

Ruby on Railsでnewから取得してアクションを作成して表示ページにデータを表示するにはどうすればよいですか?

概要

こんにちは、Rails を使用しており、送信ボタンをクリックした後にデータを取得しようとしていますが、送信ボタンを押してもデータが保存されません。保存後に show.html.erb にデータを表示する方法を教えてください。コードは次のとおりです。の:

Articles_controller.erb:

class ArticlesController < ApplicationController



  def show
    @article = Article.find(params[:id])
  end



  def index
    @articles = Article.all
  end

  def new
    @article=Article.new
  end



  def create
    @article = Article.new(article_params)
    @article.save
    redirect_to @article
  end

  private

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

新しい.html.erb:

<h1>Create new File</h1>

<%= form_with scope: :article, url: articles_path , local: true do |f| %>
  <p>
    <%= f.label :title, "Title" %><br/>
    <%= f.text_field :title %>
  </p>
  <p>
    <%= f.label :description, "Description" %><br/>
    <%= f.text_area :description %>
  </p>
  <p><%= f.submit %> </p>
<% end %>

ルート.rb:

Rails.application.routes.draw は実行します

  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

  # Defines the root path route ("/")
  root "articles#index"
  resources :articles, only: [:edit, :update, :show, :destroy, :index, :new]

end

show.html.erb:

<h1>show</h1>
<h3><strong>Title: </strong><%= @article.title %></h3>
<h3><strong>Description: </strong><%= @article.description %></h3>

解決策

あなたが従うチュートリアルが何であれ、それはあまり良いものではないと思います。

レコードの作成または更新が成功すると単純に仮定しないでください (仮定すると、… が作成されます)。ユーザーが無効な入力を行う場合は、それに対処する必要があります。

class ArticlesController < ApplicationController

  # ...

  # POST /articles
  def create
    @article = Article.new(article_params)
    if @article.save
      redirect_to @article
    else
      render :new # render the form again but with error messages
    end
  end

  private

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

また、リソースに作成アクションの POST /articles ルートを生成させる必要もあります。

# there is no point in using "only" when you're generating everything
resources :articles

また、リソース指向スタイルでフォーム ヘルパーを使用することもできます。

<%= form_with model: @article do |f| %>
  <% if @article.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@article.errors.count, "error") %> prohibited this article from being saved:</h2>
      <ul>
        <% @article.errors.each do |error| %>
          <li><%= error.full_message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <p>
    <%= f.label :title, "Title" %><br/>
    <%= f.text_field :title %>
  </p>
  <p>
    <%= f.label :description, "Description" %><br/>
    <%= f.text_area :description %>
  </p>
  <p><%= f.submit %></p>
<% end %>

これにより、入力がモデルにバインドされるため、検証が失敗した場合でもフォームが空白にならず、ユーザーが非常に不満を抱くことになります。検証が失敗した場合には、フォームにエラー メッセージも表示されます。

Rails は構成よりも慣習主導です。特別な理由がない限り、URI、スコープなどを構成する必要はありません。また、構成する必要もありません。

Rails は、モデルを参照して、フォームアクションにどのパス (/articles または /articles/:id) を使用するか、および正しい HTTP メソッドを判断します。

Rails での基本的な CRUD 操作は、公式ガイドで十分にカバーされています。