Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 Rails实例变量未通过“传递到视图”;渲染“;_Ruby On Rails 4_Render_Instance Variables - Fatal编程技术网

Ruby on rails 4 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)

基本rails问题..我有以下几点:一个用户有很多包,一个包属于一个类别。在新的包表单中,我想用包的类别创建一个选择字段。我有以下代码:

      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