いろいろな不具合の修正...。

サインアップした時のメッセージが二重になってしまう...。

LoginEngineを利用していて、アカウント登録を繰り返していると、メッセージが以下のように表示されてしまう。

『登録されているEメールアドレスに確認のメールを送りました。内容をご確認いただき、手続きを続けてください。』このメッセージがアカウント登録の度に二重、三重...と繰り返されてしまうのだ。

vendor/plugins/login_engine/app/controllers/user_controller.rbの修正

上記ファイルを、以下のように修正した。

...(途中省略)...
  def signup
    return if generate_blank
    params[:user].delete('form')
    params[:user].delete('verified') # you CANNOT pass this as part of the request
    @user = User.new(params[:user])
    begin
      User.transaction(@user) do
        @user.new_password = true
        unless LoginEngine.config(:use_email_notification) and LoginEngine.config(:confirm_account)
          @user.verified = 1
        end
        if @user.save
          key = @user.generate_security_token
          url = url_for(:action => 'home', :user_id => @user.id, :key => key)
          # 以下の1行を削除
          # flash[:notice] = _('Signup successful!') #<---削除
          if LoginEngine.config(:use_email_notification) and LoginEngine.config(:confirm_account)
            UserNotify.deliver_signup(@user, params[:user][:password], url)
          # 以下のように修正
          # flash[:notice] << _(' Please check your registered email account to verify your account registration and continue with the login.') #<---修正前
            flash[:notice] = _('Signup successful! Please check your registered email account to verify your account registration and continue with the login.') #<---修正後
          else
          # 以下のように修正
          # flash[:notice] << _(' Please log in.') #<---修正前
            flash[:notice] = _('Signup successful! Please log in.') #<---修正後
          end
          redirect_to :action => 'login'
        end
      end
...(途中省略)...

どうやら「flash[:notice] << "文字列"」のように追記代入していると、flashの過去の文字列がそのまま残ってしまう?コードの流れは詳しく分からないが、上記のように「=」で代入するようにしたら、メッセージの繰り返しはなくなった。

Firefoxでテーブル表示が崩れてしまう...。

FireFoxで確認したら、フリーワード検索の入力フォームが表示されなくなっていた。

赤枠で囲った部分が表示されない...。これは、以下のファイルを確認して、すぐに間違いに気づいた。tableタグの中にdiv要素を含めてしまっていたためだ。(_list_form.rhtmlでdiv要素が描画される。)tableタグの外側に書き直したら、正常に動作した。

app/views/softwares/list.rhtmlの修正
...(途中省略)...
<%= render :partial => 'models/softwares/list_form' %><%######テーブルの外側に書き直した。%>
<table class="confirm" width=100%>
  <%#= render :partial => 'models/softwares/list_form' %><%######テーブルの内側に<div>要素のrender :partialが入ってしまっていた。%>
  <%= render :partial => 'models/softwares/listh' %>
  <% if !@softwares.empty? %>
    <%= render :partial => 'models/softwares/listd', :collection => @softwares %>
  <% else %>
    <tr><td colspan="6">レコードはありません。</td></tr>
  <% end %>
...(途中省略)...

ユーザーを削除したら、関連するソフトウェアレコードも削除したい。

現状では、以下のような問題が発生していた。

  1. 新規アカウント登録でtaroユーザーを追加する。
  2. taroユーザーで、いくつかソフトウェアタイトルを追加する。
  3. その後、taroユーザーを削除する。
  4. すぐに、jiroユーザーを追加する。
  5. そうすると...

jiroユーザーは、今までtaroユーザーが入力したソフトウェアタイトルを見れてしまう。これは問題だ。

原因は、ユーザー削除のときに、ユーザーだけしか削除していないからだ。ユーザーを削除する時には、そのユーザーに紐付くソフトウェアタイトルも削除する必要がある。その方法がRailsにはちゃんと用意されていた。

app/models/user.rbへの追記

UserControllerに、以下の1行を追記するだけだ。:dependent => :destroyのオプション設定をすることで、destroyメソッドで関連するレコードも削除されるようになる。(LoginEngineのユーザー削除は、destroyメソッドで処理されている。user_controller.rbのdelete、do_delete_userメソッドのコードを追ってみた。)

has_many :softwares, :dependent => :destroy

ところで、user.rbはapp/modelsフォルダの中には存在しない。元々はLoginEngine、またはUserEngineのapp/modelsフォルダの中にある。当初、vendor/plugins/login_engine/app/models/user.rbを、app/modelsフォルダにコピーして、そこに上記のコードを追記していた。(だって、LoginEngineによる削除機能だったから...。)しかし、これでは何も変わらなかった...。
UserEngineは、LogineEngineをオーバーライドしている。どちらにも存在するmodels/user.rbをカスタマイズする場合は、UserEngineのファイルを、コピーする必要があるようだ。このことは、UserEngineのドキュメント、Installingの12.項に書いてあった。

それでは早速、vendor/plugins/user_engine/app/models/user.rbを、app/modelsフォルダにコピーし直して、上記コードを追記した。これで、ユーザー削除と同時に、関連するソフトウェアタイトルも削除されるようになった!

常に列幅を一定に保ちたい!

リスト表示で、ページ内の表示条件によって、その都度、列幅が変わってしまうと何とも見苦しい。ウィンドウサイズが変わらなければ一定の列幅を保つようにしたい。スタイルシートでやるべきか悩んだが、以下のようにやってしまった。

app/views/list.rhtml
<table class="confirm" width=100%>

テーブル幅はウィンドウ一杯になるように設定したつもり。

app/views/models/softwares/_listh.rhtml
<%# 全部で86%で14%足りないが、14%の余りは、詳細 編集 削除リンクの列幅になる。 %>
<% cell_width = {"title"=>16, 
           "description"=>30, 
            "created_on"=>12, 
            "updated_on"=>12, 
            "keyword_id"=>16} %>
<!--[:]-->
<tr>
  <% for column in Software.columns %>
    <% unless @controller.class.hidden_field?(@action_name, column.name) %>
      <th width=<%= cell_width[column.name].to_s %>% >
...(途中省略)...
<!--[:]-->

< th width=<%= cell_width[column.name].to_s %>% >で、ファイルの先頭で宣言した列タイトルごとの列幅を設定している。これで、常に同じ列幅で表示されるようになった!