eachでループにそれぞれmodalを付ける方法

<エラー内容>

Eachした要素に対してそれぞれmodalで編集機能を実装した際にエラーが発生。

全てのmodalに対してid=1のモーダルが表示されてしまう。

<解決策>

それぞれのmodal IDをuniqueにしなければならない。よって、buttonのdata-target要素、modalのid要素にuniqueになるようにidを加えてあげなければならない。

data-target = #<your modal id><%= project.id %>

~Source~

実際のフォームでのidは、edit_project_<id>になる!!

<form class="edit_project" id="edit_project_1" action="/users/101/projects/1" accept-charset="UTF-8" data-remote="true" method="post"><input name="utf8" type="hidden" value="✓"><input type="hidden" name="_method" value="patch">

jquery - Displaying a modal for one entry in a .each loop - Rails / Bootstrap - Stack Overflow

 

もう一つ問題が発生。。レスポンスをajaxで受け取る際に、セレクタの指定の仕方がわからない、、

<解決策>

正規表現を使うことで実装成功。

editProject = $('div[id^="#editProject"]')

$(document).on 'ajax:success', editProject, (xhr, data, status) ->location.reload()

とした!

jQueryのセレクタに正規表現・属性フィルタを使う方法! | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト

x-editableを使ってupdateアクションを実装

やろうとしたこと

インラインエディタを可能にするx-editableを用いて、userにネストされているprojectのupdateアクションを実装した。

X-editable :: In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery

手順:

Ⅰ.X-editableを使用可能に

上記のサイトから、zipファイルをダウンロードし、マニフェストファイルにインクルードさせる。サーバーを立てて、htmlの検証、headタグにx-editableが読み込まれていることを確認

Ⅱ.X-editableを使う。

1. 

 

Link_to タグにhtmlメソッドを入れ子する書き方

例)

<%= link_to user_project_path(@user, project) do %>
  <div class="list-group-item" id="editable" data-type="text" data-pk="1" data-url="/patch" data-title="Edit Project">
  <%= project.name %>
  </div>
<% end %>

 

Prefixの確認の仕方

1.コンソールを開く

2.下記コマンド

include Rails.application.routes.url_helper

include ActionView::Helpers

3.自分が正しいと思うPrefixを入力し、正しいurlが返ってくることを確認

 

ネストされたアクションのprefix

例)/user/:id/project/:idのupdateアクション

=> user_project_path(@user, project)

 

超お世話になっている参考文献

Assets関係

・Assetsで困った時のTrouble Shooting

Rails Asset Pipelineがうまくいかないときの問題の切り分けかた - Qiita

・Assetsを理解するためのTutorial

[Ruby入門 Rails5編] 05. アセットパイプラインでフロントエンドのリソースを管理する - Qiita

・Bootstrap-sass導入方法

Rails で Bootstrap を使う gem「bootstrap-sass」を導入する - Corredor

javascript / jquery動作確認

Rails jQueryを使用する – KeruuWeb

・AdminLTE使用方法

管理画面を作る:AdminLTE 基本編 - Qiita

 

Modal応用

RailsでAjax - モーダル表示でフォーム入力。バリデーションエラーが発生したら画面遷移せずにメッセージを表示し、成功時はフラッシュメッセージ付きでリダイレクトしたいとき - Qiita

formをValidateしてAjaxで通信 - Qiita

【Bootstrap3】モーダルに「data-*」属性でデータを渡す - Qiita

 

CoffeeScript

CoffeeScript入門メモ - Qiita

Form_forでNoMethodError,objectがnil

userとhas_many関係にあるprojects作成のformをform_for使って書いた時に起こったエラー&様々な修正

 

初期のコード

def create
        project = @user.projects.build do |t|
          t.project_id = params[:project_id]
          t.comment = params[:user][:comment]
        end
        if project.save
          flash[:notice] = 'このイベントに参加しました'
          head 201
        else
          render json: {messages: project.errors.full_messages}, status: 422
        end
      end


def show
       @user = User.find(session[:user_id])
     end
 

=> Projectsがnilであるというエラーが返ってきた。。

最終的なコード

 

def create
@project = current_user.projects.build(project_params)
if @project.save
flash[:notice] = 'プロジェクトを追加しました。'
head 201
else
render json: {messages: project.errors.full_messages}, status: 422
end
end

def show
@user = User.find(params[:user_id])
@project = current_user.projects.build if logged_in?
end

private

def project_params
params.require(:project).permit(:name)
end
end

 

解決!

問題の根本は、project_idがparamsからnilで送られてくるためだった。t.project_id = params[:project_id]の部分をuser_idに変えてみたら出来てただろう、、

今回はbyebugが活躍。def createの真下にbyebugを置き、paramsの値を確かめまくった。

formでエラーになったら、まずはbyebugで求めているparamsの値がnilでないかどうかを確かめるべし!

 

 

 

管理ページの作成

管理ページの概要

user / :id / projects / show

 

ページ推移

1. Routing 設定 (projects # show)

2. user # showのview に link_toで飛ぶように設定

 

Project # showのview

1. 名前 and icon 表示

2. user登録に目標を書きこむ

<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>

3. Project 入力画面 (user / :id / projects / show)

modal window (p 206 参照)

<%= form_for [@user, @project], remote: true %>

  <div class="modal-body">

         <div class="">

  </div>

<% end %>

4. 

slimscrollがインストールされない、、

adminlteのsidebar-toggleが動かないので、ググってみたら、jquery.slimscrollのプラグインがなかったのが問題。

Left Slide toggle not working · Issue #1200 · almasaeed2010/AdminLTE · GitHub

gemを使ってインストールしようと思ったが、インクルードされなかったので、今回は諦める。

jquery-slimscroll-railのgithub

GitHub - marcosnogueira/jquery-slimscroll-rails

jquery-slimscrollの使い方

jQuery slimScroll | rocha.la | JavaScript and my other hobbies

 

bootstrapのdropdownメニューが動かない

bootstrap-sassのgemを使用。問題は、bootstrap-sprocketsのせいでdropdown menuが機能しないこと。bootstrap-sprocketsを除くと動くが、production環境で動かなくなると書いてあったので、今回は、

https://github.com/twbs/bootstrap-sass/issues/714

'jquery-ui'をインストールしたら解決するっぽいが、今回は、下記をapplication.jsに記述することで解決

$(document).ready(function(){ $('.dropdown-toggle').dropdown(); });

他にも、jquery-uiをインストールする解決法など書いてあったが、またの機会にじっくり考えたい。

JS //= require bootstrap-sprockets breaks dropdowns · Issue #714 · twbs/bootstrap-sass · GitHub