2012-06-30 2 views
1

Possible en double:
Passing only two variables between controller and view - best practice?Rails: variables Partager entre le contrôleur et la vue

Il est mon action:

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

Il est mon avis (j'ai enlevé quelques lignes):

<% @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 %> 

Il y a 3 variables: @codes (liste des articles), @code (poste actuel, utilisé dans une autre action) et @languages.

Mon IDE écrit:

Dans la plupart des deux variables d'instance doivent être partagées entre le contrôleur et vue
Cette inspection met en garde s'il y a plus de deux variables d'instance partagées entre un contrôleur et une vue. Un contrôleur doit gérer uniquement une variable d'instance, plus une seconde pour la variable current_user .

Habituellement, je partage plus de variables entre Controller et View (en PHP), parfois 10+.
Comment cela se fait-il dans Rails?

+3

http://stackoverflow.com/questions/ 7051053/passing-only-two-variables-between-controller-and-view-best-practice – ShaggyInjun

Répondre

2

Vous pouvez enregistrer en faisant des langues une aide d'une instance var:

def languages 
    Language.order('name').collect {|l| [l.name, l.coderay]} 
end 
+0

Je l'utilise seulement à 1 place de mon code (en vue). Est-ce que tu es sûr que c'est une bonne pratique de le faire comme aide? – DmitryR

+2

Création d'un assistant pour enregistrer une instance var est à mon humble avis loin d'une meilleure pratique si l'assistant n'est utilisé que dans un seul endroit. Ou comme Rail Spikes [mettez-le] (http://railspikes.com/2008/8/22/how-to-fix-your-rails-helpers): "Les helpers sont des générateurs de balisage. balisage, ils ne sont pas des aides et peuvent être poussés dans un modèle ". –

+1

@michael - Je peux être d'accord avec ça. Le mettre dans un modèle a du sens pour moi. En fait, il y a probablement une façon plus simple de le mettre directement dans la vue. – pguardiario

2

C'est simplement une bonne pratique de Rails.

Mais je lirais un peu plus sur Rails Routing. Comprendre le fonctionnement du routage Rails devrait vous donner une meilleure idée de la façon de structurer votre code.

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

J'ai modifié votre code un peu, non testé. Mais j'espère que vous avez de bonnes idées.

Controller:

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 

Vue:

<% @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 %> 
+0

Vous avez oublié d'implémenter language_list. Il semble que ce serait la partie la plus importante de votre réponse. – pguardiario

+0

En regardant le code qu'il fournissait, il semblait qu'il en bénéficierait davantage en comprenant mieux comment le routage de Rails fonctionnait et comment les choses devraient être structurées en général. Mais votre droite, en ajoutant un commentaire au-dessus de mon changement serait plus clair. Mais le simple fait de fournir une réponse directe à un problème très vaste n'est que très utile. – davissp14

+0

Je pense que vous pensiez que c'était plus large que ça ne l'était en réalité. La question était de savoir comment éliminer 1 instance var. – pguardiario

Questions connexes