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動作確認
・AdminLTE使用方法
・
Modal応用
・RailsでAjax - モーダル表示でフォーム入力。バリデーションエラーが発生したら画面遷移せずにメッセージを表示し、成功時はフラッシュメッセージ付きでリダイレクトしたいとき - Qiita
・formをValidateしてAjaxで通信 - Qiita
・【Bootstrap3】モーダルに「data-*」属性でデータを渡す - 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