Ruby on rails 4 Rails实例变量未通过“传递到视图”;渲染“;
基本rails问题..我有以下几点:一个用户有很多包,一个包属于一个类别。在新的包表单中,我想用包的类别创建一个选择字段。我有以下代码:Ruby on rails 4 Rails实例变量未通过“传递到视图”;渲染“;,ruby-on-rails-4,render,instance-variables,Ruby On Rails 4,Render,Instance Variables,基本rails问题..我有以下几点:一个用户有很多包,一个包属于一个类别。在新的包表单中,我想用包的类别创建一个选择字段。我有以下代码: def new_pack @pack=Pack.new() @user= User.find(params[:id]) @categories = Category.all end def create @pack=Pack.new(pack_params)
def new_pack
@pack=Pack.new()
@user= User.find(params[:id])
@categories = Category.all
end
def create
@pack=Pack.new(pack_params)
@user= User.find(params[:user_id])
if @pack.save
@user.packs << @pack
flash[:notice]="Thank you!"
redirect_to(:action=>'attempt_activation', :id=> @pack.id)
else
render :action=> "new_pack", :id=>@user.id
end
end
def新包装
@pack=pack.new()
@user=user.find(参数[:id])
@categories=Category.all
结束
def创建
@pack=pack.new(pack_参数)
@user=user.find(参数[:user\u id])
如果@pack.save
@user.packs'尝试\激活',:id=>@pack.id)
其他的
呈现:action=>“new_pack”,:id=>@user.id
结束
结束
在我看来:
<%= form_for(:pack, :url=>{:controller=> "packs", :action=>'create', :user_id=> @user.id}) do |f| %>
<h5>Registration takes less than 2 minutes.</h5>
<label>Title<b style="color:red;">*</b>
<%= f.text_field(:title, :placeholder=>"") %>
</label>
<label>Category<b style="color:red;">*</b>
<%= f.select(:category_id, @categories.map {|s| [s.title, s.id]}, :selected=> @categories.second) %>
...
{:controller=>“packs”,:action=>“create”,:user_id=>@user.id})do | f |%>
注册不到2分钟。
头衔*
"") %>
类别*
@类别(第二类)%>
...
问题在于,如果表单和中存在错误,并且必须再次呈现新的_pack操作,则会抛出错误:
ActionView::Template::Error (undefined method `map' for nil:NilClass):
</div>
<div class="large-4 columns">
<label>Category
<%= f.select(:category_id, @categories.map {|s| [s.title, s.id]}, :selected=> @pack.category) %>
</div>
ActionView::Template::Error(nil:NilClass的未定义方法“map”):
类别
@包装类别)%>
为什么会这样?render用于使用操作中可用的实例变量渲染特定视图,但此处不再加载@categories
谢谢。添加
@categories=Category。创建方法中的所有:
def create
@pack = Pack.new(pack_params)
@user = User.find(params[:user_id])
if @pack.save
@user.packs << @pack
flash[:notice] = "Thank you!"
redirect_to(:action => 'attempt_activation', :id => @pack.id)
else
@categories = Category.all
render :action=> "new_pack", :id => @user.id
end
end
def创建
@pack=pack.new(pack_参数)
@user=user.find(参数[:user\u id])
如果@pack.save
@user.packs'尝试\激活',:id=>@pack.id)
其他的
@categories=Category.all
呈现:action=>“new_pack”,:id=>@user.id
结束
结束
Zishe感谢您的回答。这是正确的,但你能给我一个简单的解释这个解决方案吗?当我渲染“new_pack”操作时,它们会加载create操作的实例变量??当然<代码>渲染操作:
与渲染模板相同。不可能以某种方式触发其他操作,只能重定向。而且,当您仅呈现该模板时,您应该拥有所有必要的数据,包括@categories