saru1439s7
@saru1439s7

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

画像を投稿する機能の実装中のエラー form_with model :group

解決したいこと

Ruby on Railsで本を投稿するグループ作成するWebアプリをつくっています。
グループ画像を投稿する機能の実装中にエラーが発生しました。
解決方法を教えていただきたいです。

同じ部分でエラーが出され
NoMethodError in Groups#edit
NoMethodError in Groups#new
でエラーが起きています

以下は部分テンプレート内のため@付けずに入力しています。

スクリーンショット 2021-08-07 13.28.36.png

該当するソースコード

groups/_form.html.erb 部分テンプレート
<%= form_with model :group, local:true do |f| %>
  <div class="form-group">
    <%= f.label :グループ名 %>
    <%= f.text_field :name %>
  </div>

  <div class="form-group">
    <%= f.label :紹介文 %>
    <%= f.text_area :introduction %>
  </div>

  <div class="form-group">
    <%= f.label :グループ画像 %>
    <%= f.attachment_field :image %>  エラー該当
  </div>

  <div class="form-group">
    <%= f.submit class: 'btn btn-info' %>
  </div>
<% end %>
groups/new.html.erb 部分テンプレート呼び出し
<div class='container'>
  <div class='row'>
    <div class="col-sm-12 col-md-8 col-lg-5 px-5 px-sm-0 mx-auto">
        <h1>Create Group</h1>
        <%= render 'layouts/errors',obj: @group %>
        <%= render 'groups/form', group: @group %> エラー該当
  </div>
 </div>
</div>
group/edit.html.erb部分テンプレート呼び出し
<div class='container'>
  <div class='row'>
    <div class="col-sm-12 col-md-8 col-lg-5 px-5 px-sm-0 mx-auto">
        <h1>Editing Group</h1>
        <%= render 'layouts/errors', obj: @group %>
    <%= render 'groups/form', group: @group %> エラー該当
  </div>
</div>
groups.controller.rb
class GroupsController < ApplicationController
  before_action :authenticate_user!
  before_action :ensure_correct_user, only: [:edit, :update]


  def index
    @book = Book.new
    @groups = Group.all
  end

  def show
    @book = Book.new
    @group = Group.find(params[:id])
  end

  def join
    @group = group.find(params[:group_id])
    @group.users << current_user
    redirect_to groups_path
  end

  def new
    @group = Group.new
  end

  def create
    @group = Group.new(group_params)
    @group.owner_id = current_user.id
    @group.users << current_user
    if @group.save
      redirect_to groups_path
    else
      render 'new'
    end
  end

  def edit
     @group = Group.find(params[:id])
  end

  def update
    if @group.update(group_params)
      redirect_to groups_path
    else
      render "edit"
    end
  end

  def destroy
    @group = Group.find(params[:id])
    @group.users.delete(current_user)
    redirect_to groups_path
  end

 ここで指定してます 
 private
  def group_params
    params.require(:group).permit(:name,:introduction,:image )
  end

  def ensure_correct_user
    @group = Group.find(params[:id])
    unless @group.owner_id == current_user.id
      redirect_to groups_path
    end
  end

end

models/group.rb
class Group < ApplicationRecord
has_many :group_users
has_many :users ,through :group_users

validates :name, presence:true
validates :introduction, presence:true
ここです attachment :image, destroy:false
end

マイグレーションファイル
class CreateGroups < ActiveRecord::Migration[5.2]
  def change
    create_table :groups do |t|
      t.string :name
      t.text :introduction
      t.string :image_id
      t.integer :owner_id
      t.timestamps
    end
  end
end
schema

ActiveRecord::Schema.define(version: 2021_08_05_062250) do

 :

  create_table "group_users", force: :cascade do |t|
    t.integer "user_id"
    t.integer "group_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["group_id"], name: "index_group_users_on_group_id"
    t.index ["user_id"], name: "index_group_users_on_user_id"
  end

  create_table "groups", force: :cascade do |t|
    t.string "name"
    t.text "introduction"
    t.string "image_id"
    t.integer "owner_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

:

Gemfile

gem "refile", require: "refile/rails", github: 'manfe/refile'
gem "refile-mini_magick"

自分で試したこと

コードの見直しや、画像投稿方法の確認・学習、
refileがちゃんと入っていない?と考え rails db:migrateしましたが変わらず(ユーザー画像の投稿はできる状態です)
rails db:statusも全てupになっていました。

初めて質問投稿しましたが、不足ありましたら教授いただければ幸いです。

0

2Answer

https://railsdoc.com/page/form_with
paramsはhashです(キーがsymbol)。

rubyは極限まで色々省略できるので慣れるまで何が何やら分かりません。

<%= form_with model: :group, local:true do |f| %>

<%= form_with({
  model: :group, 
  local: true
}) do |f| %>
<%
params = {
  model: :group, 
  local: true
}
%>
<%= form_with(params) do |f| %>

などとやってる事と同じです。

1Like

Comments

  1. @saru1439s7

    Questioner

    省略しててあの形になっていたのですね
    ↑のように縦に並べると分かりやすいです^^!

    貴重な時間いただきありがとうございました!
    慣れるまで先長いですががんばります。
-<%= form_with model :group, local:true do |f| %>
+<%= form_with model: :group, local:true do |f| %>

modelだとここの場合ローカル変数とみなされます。

0Like

Comments

  1. @saru1439s7

    Questioner

    @github0013@githubさん
    model: :groupにしてみたら、うまく行きました。ありがとうございました!泣
    「:」で変わって!??????となっています

    form_withの書き方よくわかっておらず、 
    form_with model(など) :〜 , local:true do |f|で覚えていました。

    model: :groupの記述の意味、form_with、local true調べていますが理解が追いついていないです。どう検索すればいいのか、アドバイス頂ければ嬉しいです.

Your answer might help someone💌