1

「show」、「show_modify」という2つのアクションを持つコントローラーがあります。これらは非常に似ていますが、わずかに異なるビューを持っています。つまり、show_modify には異なるdivクラスがあり、追加のリンク/ボタンなどがあります。

私が見てきたことから、レールでこれにアプローチするにはいくつかの方法があります。

  1. 2 つのテンプレートを 1 つ作成し、内部に条件を追加するだけです。

    <% if param[:action]=="show_modify"> <% ... %> <% end %>
    

    それでも、非常に多くの違いがあるため、これは非常に見苦しく繰り返しのように見えます。また、これは教会と国家の分離に対するある種の違反でもあります (私は MVC の専門家ではありません...)。

  2. 部分的な方法: 異なって表示される要素ごとに、アクションごとに 1 つずつ、2 つの部分を作成します。ビューは次のようになります。

    # show_modify
    render :partial '_general_stuff'
    render :partial => '_blabla_show_modify'
    
    # show  
    render :partial => '_general_stuff'  
    render :partial => '_blabla_show'  `  
    

    ただし、重複する要素があるため、これは DRY に違反します。サブパーシャルをさらに作成し続けることはできますが、基本的にはタートルを最後まで使用することになります。繰り返したくない場合は、最終的には if/else を実行する必要があります。

  3. 地元の人々とのパーシャル:

    if show  
         render :partial = '_blabla', :locals => {:bckgrnd => 'blue', :button => 'yes' ....}
    

    しかし、これは別の多くの場合の解決策です....

より良いオプションはありますか?content_for多分?私は一種のRails初心者なので、何かを完全に見逃しているかもしれません....

4

4 に答える 4

0

あなたの説明から、2 つのビューはあまり似ていないように見えます。完全なビュー全体で、あらゆる種類の例外が作成されています。したがって、機能していない多くの if ステートメントまたはパーシャルの問題があります。

ビューがよりよく一致するようにビューをリファクタリングすることはできませんか? たとえば、div クラス名を同じに保ち、ビューに応じて CSS を切り替えます。次に、部分ビュー メソッドを使用すると、はるかにうまく機能する可能性があります。特に、リンク (送信ボタン?) をこの部分ビューの外に移動し、show_modify ビューに配置する場合は特にそうです。

于 2010-01-12T13:13:58.647 に答える
0

違いが非常に小さい場合は、最初のアイデアを使用できますが、いくつかのヘルパーを作成したいと思います。

def show_modify?
  param[:action] == "show_modify"
end

そしてビューで:

<% if show_modify? %>
  some html
<% end %>
...
<%= link_to "something", some_path if show_modify? %>

等々。

div のクラスの場合、ヘルパー メソッドを使用してクラス名を生成します。

def set_class
  return "first_class" if show_modify?
  "second_class"
end
于 2010-01-12T13:15:35.577 に答える
0

オブジェクトをビュー モデルとして拡張してみてください。ビジネス ドメインとは関係のないものでドメイン オブジェクトを拡張する場合、これは ASP.NET MVC では非常に一般的です。

class User < ActiveRecord::Base
  # id, integer
  # first_name, string
  # last_name, string
  # only put the business-y stuff here. validations, etc.
end

class ShowUserViewModel < User
  def background_color
    "#0000ff"
  end

  def template
    "show"
  end
end

class EditUserViewModel < User

  def background_color
    "#00ff00"
  end

  def template
    "show_modify"
  end
end

コントローラーから、実行したアクションに応じて、適切なオブジェクトを返します。ビュー モデルは引き続き「ユーザー」ですが、ビューに必要な情報が追加されています。これにより、実際に多くの構造物が視界に入らないようにすることができifますfor

于 2010-01-12T13:16:54.730 に答える