Rails实例变量没有传递给" Render"

时间:2014-09-06 23:24:24

标签: ruby-on-rails-4 render instance-variables

基本轨道问题..我有以下内容:用户有很多包,一个包属于一个类别。在新包装表单中,我想要使用包装类别进行选择字段。我有以下代码:

      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 

在我看来:

      <%= 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) %>
        ...

问题是,如果表单中存在错误并且必须再次呈现new_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>

为什么会这样? render用于使用动作中可用的实例变量渲染特定视图,但这里不再加载@categories。

谢谢。

1 个答案:

答案 0 :(得分:9)

在create method中添加@categories = Category.all

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