1

重複の可能性:
コントローラーとビューの間で 2 つの変数のみを渡す - ベスト プラクティス?

私の行動があります:

  def list
    @codes = Code.order("created_at")
    @languages = Language.order('name').collect {|l| [l.name, l.coderay]}
  end

私の見解があります(いくつかの行を削除しました):

<% @codes.each do |code| %>
    <div class="code">
        <%= link_to code.title, :action => 'show', :id => code.id %>
        <% if  code.author %>
            @<%= code.author %>
        <% end  %>
    </div>
<% end %>
<%= render :partial => 'shared/error_messages', :locals => {:object => @code} %>
<%= form_for :code, :url => {:action => 'create' }, :html => {:multipart => true} do |f| %>
    <%= f.text_field :title %><br />
    <%= f.text_area :content %><br>
    <%= f.select(:language, @languages, {:selected => 'text'}) %>
    <%= f.text_field :author %><br>
    <%= f.submit "Submit code" %>
<% end %>

その中には 3 つの変数があります: @codes(投稿のリスト)、@code(現在の投稿、別のアクションで使用)、および @languages。

私のIDEは次のように書いています:

コントローラーとビューの間で共有されるインスタンス変数は最大で 2 つです。
このインスペクションは、コントローラーとビューの間で共有されるインスタンス変数が 3 つ以上ある場合に警告します。コントローラーは、1 つのインスタンス変数と、current_user 変数用の 2 つ目の変数のみを管理する必要があります。

通常、コントローラーとビュー (PHP の場合) の間でより多くの変数を共有し、時には 10 以上の変数を共有します。
Railsではどのように行われますか?

4

2 に答える 2

2

言語をヘルパーにすることで、インスタンス var を保存できます。

def languages
  Language.order('name').collect {|l| [l.name, l.coderay]}
end
于 2012-06-30T23:38:57.990 に答える
2

これは、一部の開発者が従うガイドラインです。

しかし、Rails Routing についてもう少し調べてみます。Rails のルーティングがどのように機能するかを理解すると、コードをどのように構築するかについてより良いアイデアが得られるはずです。

http://guides.rubyonrails.org/routing.html

テストではなく、コードを少し変更しました。しかし、うまくいけば、あなたにいくつかの良いアイデアが得られます.

コントローラ:

def new
   @code = Code.new
   @codes = Code.order("created_at") 
end

def create
   @code = Code.new(params[:code])
   if @code.save?
      # Do your thing.
   else
      # render your :new action passing your @code variable
   end
end

意見:

 <% @codes.each do |code| %>
    <div class="code">

    # Use Rails Routing - In console, type rake routes to get list of routes.       
    <%= link_to code.title, code_path(code.id) %>  # example.

    <% if code.author %>
        <%= code.author %>
    <% end %>
   </div>
 <% end %>

  <%= render 'shared/error_messages', :object => @code %>

  <%= form_for @code, :html => {:multipart => true} do |f| %>
     <%= f.text_field :title %><br />
     <%= f.text_area :content %><br>

     # language_list = helper method.
     <%= f.select(:language, language_list, {:selected => 'text'}) %>
     <%= f.text_field :author %><br>
     <%= f.submit "Submit code" %>
  <% end %>
于 2012-06-30T22:53:06.597 に答える