質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.19%

formに関する質問です Rails

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 139

sn.jr

score 53

form_withなどを使ってデータを新しく作ったり、更新したりしたいのですがその仕組みがいまいちわかりません。パラメーターの理解が曖昧なのかと思います。

下記のURLで編集画面があった場合、updateは以下のようにかけると思います(著書から抜粋している)。

このupdateアクションにある二つのparamsはどこからデータを受け取っているのですか?僕の予想だと1つめは下記のURLのentries/10/の10の部分、二つ目はentries/の部分でしょうか?複数と単数で異なる気がするのですが、どなたか説明していただけると幸いです。また二つ目のparamsの中身はidじゃいけないのでしょうか?

http://localhost:3001/entries/10/edit

def update
    @entry = current_member.entries.find.(params[:id])
    @entry.assign_attributes(params[:entry])
   if @entry.save
省略
  end


edit.html

<% @page_title = "ブログ記事の編集" %>
<h1><%= @page_title %></h1>

<div class="toolbar"><%= link_to "記事の表示に戻る", @entry %></div>

<%= form_for @entry do |form| %>
  <%= render "form", form: form %>
  <div><%= form.submit %></div>
<% end %>


edit.htmlのrender先の_form.html

<%= render "shared/errors", obj: @entry %>

<table class="attr">
  <tr>
    <th width="80"><%= form.label :title %></th>
    <td><%= form.text_field :title, size: 50 %></td>
  </tr>
  <tr>
    <th><%= form.label :body %></th>
    <td><%= form.text_area :body, rows: 10, cols: 45 %></td>
  </tr>
  <tr>
    <th><%= form.label :posted_at, for: "entry_posted_at_1i" %></th>
    <td><%= form.datetime_select :posted_at,
              start_year: 2000, end_year: Time.current.year + 1,
              use_month_numbers: true %></td>
  </tr>
  <tr>
    <th><%= form.label :status %></th>
    <td><%= form.select :status, Entry.status_options %></td>
  </tr>
</table>


routes

Prefix Verb   URI Pattern                                                                              Controller#Action
                        entries_index GET    /entries/index(.:format)                                                                 entries#index
                         entries_show GET    /entries/show(.:format)                                                                  entries#show
                          entries_new GET    /entries/new(.:format)                                                                   entries#new
                         entries_edit GET    /entries/edit(.:format)                                                                  entries#edit
                       passwords_edit GET    /passwords/edit(.:format)                                                                passwords#edit
                        accounts_show GET    /accounts/show(.:format)                                                                 accounts#show
                        accounts_edit GET    /accounts/edit(.:format)                                                                 accounts#edit
                            top_index GET    /top/index(.:format)                                                                     top#index
                       search_members GET    /members/search(.:format)                                                                members#search
                       member_entries GET    /members/:member_id/entries(.:format)                                                    entries#index
                              members GET    /members(.:format)                                                                       members#index
                                      POST   /members(.:format)                                                                       members#create
                           new_member GET    /members/new(.:format)                                                                   members#new
                          edit_member GET    /members/:id/edit(.:format)                                                              members#edit
                               member GET    /members/:id(.:format)                                                                   members#show
                                      PATCH  /members/:id(.:format)                                                                   members#update
                                      PUT    /members/:id(.:format)                                                                   members#update
                                      DELETE /members/:id(.:format)                                                                   members#destroy
                                 root GET    /                                                                                        top#index
                                about GET    /about(.:format)                                                                         top#about
                              session DELETE /session(.:format)                                                                       sessions#destroy
                                      POST   /session(.:format)                                                                       sessions#create
                         edit_account GET    /account/edit(.:format)                                                                  accounts#edit
                              account GET    /account(.:format)                                                                       accounts#show
                                      PATCH  /account(.:format)                                                                       accounts#update
                                      PUT    /account(.:format)                                                                       accounts#update
                        edit_password GET    /password/edit(.:format)                                                                 passwords#edit
                             password GET    /password(.:format)                                                                      passwords#show
                                      PATCH  /password(.:format)                                                                      passwords#update
                                      PUT    /password(.:format)                                                                      passwords#update
                             articles GET    /articles(.:format)                                                                      articles#index
                                      POST   /articles(.:format)                                                                      articles#create
                          new_article GET    /articles/new(.:format)                                                                  articles#new
                         edit_article GET    /articles/:id/edit(.:format)                                                             articles#edit
                              article GET    /articles/:id(.:format)                                                                  articles#show
                                      PATCH  /articles/:id(.:format)                                                                  articles#update
                                      PUT    /articles/:id(.:format)                                                                  articles#update
                                      DELETE /articles/:id(.:format)                                                                  articles#destroy
                              entries GET    /entries(.:format)                                                                       entries#index
                                      POST   /entries(.:format)                                                                       entries#create
                            new_entry GET    /entries/new(.:format)                                                                   entries#new
                           edit_entry GET    /entries/:id/edit(.:format)                                                              entries#edit
                                entry GET    /entries/:id(.:format)                                                                   entries#show
                                      PATCH  /entries/:id(.:format)                                                                   entries#update
                                      PUT    /entries/:id(.:format)                                                                   entries#update
                                      DELETE /entries/:id(.:format)                                                                   entries#destroy
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

1)paramsは全てURLで受け取ります。
ただしそのURLは localhost:3001/entries/10/edit ではなく
localhost:3001/entries/10/edit?entry=foo&name=bar といったものです。

2) このうち entries/10/edit のところはviewの <%= form_for @entry を解釈して作られます

3) ?から後ろは form_for の do と end の間に有る input ,select などから作られます。

4)「二つ目のparamsの中身はidじゃいけないのでしょうか?」
この場合は「idでは駄目です」ここは 画面で入力した情報に基づいて@entryのデータを書き換えるところですから、その情報を引数にする必要があります

「何でなければならないのか」というのは アプリケーションの、そのアクションの目的で変わります。そこを判断するのがプログラムする人の仕事です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/17 21:32

    ご回答ありがとうございます!丁寧な解説でとてもわかりやすかったです。一点だけ確認させていただきたいのですが、params[:entry]のentryはフォームで送信された@entryのデータを受け取るということでしょうか?

    キャンセル

  • 2019/12/17 21:38

    提示されている editのview と def update に関しての質問であるなら、 YES です。

    キャンセル

  • 2019/12/17 21:43

    承知しました!ありがとうございます!!

    キャンセル

+1

paramsは、URLからだけではなく、画面に入力された情報も受け取っています。

entries/10 の 10 が id である可能性は確かに高いです。

もし、正確な回答が必要であれば、viewファイルとconfig/routes.rbも掲載しないと、本当のところは誰にもこたえることができないと思います。


※ params[:entry] については、おそらく画面に入力されたデータが入っているはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/17 20:44

    ご回答ありがとうございます!投稿に追加しといたので確認いただけると幸いです。
    params[:entry]に画面のデータが入るのはなぜでしょうか?entryと入れたのは書籍を写しただけで、entryを入れるんだということを理解できていません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る