29

コレクションのすべてのメンバーで構成される<'ul>を出力するヘルパーを構築するために最善を尽くしています。コレクションのメンバーごとに、タイトルとメンバーをCRUDするためのリンクのdivを持つ<'li>を印刷したいと思います。これは、Railsがインデックスビューのスキャフォールディングに対して出力するものと非常によく似ています。

これが私が持っているヘルパーです:

def display_all(collection_sym)
  collection = collection_sym.to_s.capitalize.singularize.constantize.all

  name = collection_sym.to_s.downcase

  html = '' 

  html << "<ul class=\"#{name}-list\">"

  for member in collection do
    html << content_tag(:li, :id => member.title.gsub(' ', '-').downcase.strip) do
     concat content_tag(:h1, member.title, :class => "#{name}-title")
     concat link_to 'Edit', "/#{name}/#{member.id}/edit"
     concat "\|"
     concat link_to 'View', "/#{name}/#{member.id}"
     concat "\|"
     concat button_to 'Delete', "/#{name}/#{member.id}", :confirm => 'Are you sure?  This cannot be undone.', :method => :delete
    end
   end

   html << '</ul>'

 return html
end 

そして、それはまさに私が望むものを出力します。まず第一に、誰かがこれを行うためのより良い方法があると思うなら、遠慮なく私を訂正してください、私はこれを低音の厄介な方法で行っていると思いますが、現時点ではそれが私が知っている唯一の方法です。

次に、次のようにリンクをdivでラップしようとしました。

def display_all(collection_sym)
  collection = collection_sym.to_s.capitalize.singularize.constantize.all

  name = collection_sym.to_s.downcase

  html = '' 

  html << "<ul class=\"#{name}-list\">"

  for member in collection do
     html << content_tag(:li, :id => member.title.gsub(' ', '-').downcase.strip) do
     concat content_tag(:h1, member.title, :class => "#{name}-title")
     concat content_tag(:div, :class => "links-bar") do
       concat link_to 'Edit', "/#{name}/#{member.id}/edit"
       concat "\|"
       concat link_to 'View', "/#{name}/#{member.id}"
       concat "\|"
       concat button_to 'Delete', "/#{name}/#{member.id}", :confirm => 'Are you sure?  This cannot be undone.', :method => :delete
     end
   end
 end

 html << '</ul>'

 return html
end 

ただし、ビューへのdiv.links-bar出力内のマークアップは取得できなくなりました。これはブロックとバインディングと関係があるはずですが、私は一生の間、それを修正するために何をどのように行うかを理解することができます。誰か助けてもらえますか?

4

3 に答える 3

46

パーシャルの使用を推奨する上記のコメントに同意します...しかし、ヘルパーでこれを行う必要がある場合、これはよりクリーンな実装方法です。

def display_all(collection)
  content_tag(:ul, class: "list") do
    collection.collect do |member|
      concat(content_tag(:li, id: member.name.gsub(' ', '-').downcase.strip) do
        member.name
      end)
    end
  end
end

コレクションを作成するためにシンボルを渡すのではなく、コレクションを明示的に渡すので、特定のテーブルのすべてのレコードを一度に表示する必要はありません。ページ付けなどを追加できます。

于 2010-09-04T19:50:51.613 に答える
25

@Joe、あなたはまだあなたのメソッドを使うことができますdisplay_all(collection_sym) ただ使う: return html.html_safe 代わりに: return html

多くの場合、パーシャルを使用するよりも、ヘルパーからHTMLを生成する方がよいことがわかります。したがって、Rails 3html_safeの関数は、HTMLをに変換するのではなく、HTMLを生成することを確認します。String

于 2011-03-11T22:45:29.370 に答える
2

concat@TheDelChopが言うように、内部にはが必要ですcontent_tag。そうでない場合、出力は<ul></ul>

これは次のようになります。

def display_all(collection)
  content_tag(:ul, :class => "list") do
    collection.collect do |member|
      concat(
        content_tag(:li, :id => member.name.gsub(' ', '-').downcase.strip) do
          member.name
        end
      )
    end
  end
end

詳細はこちら:Rails3でのcontent_tagのネスト

于 2015-12-10T11:12:54.257 に答える