可能重复:
Passing only two variables between controller and view - best practice?
有我的行动:
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写道:
控制器和控件之间最多应共享两个实例变量 查看
如果有两个以上的实例,此检查会发出警告 控制器和视图之间共享的变量。控制器应该 只管理一个实例变量,再加上第二个变量 current_user变量。
通常我在Controller和View之间共享更多变量(在PHP中),有时10+ 如何在Rails中完成?
答案 0 :(得分:2)
它只是一个Rails最佳实践。
但我会更多地阅读Rails路由。了解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 %>
答案 1 :(得分:2)
您可以通过将语言作为帮助来保存实例var:
def languages
Language.order('name').collect {|l| [l.name, l.coderay]}
end