1

当我最初调用新函数时,所有变量都会正确加载。params[:code] 是在路由中定义的 URL 参数。但是,当 create 验证失败并呈现 new 时,不会加载 @m 变量(这会在“new”模板中调用 @m 的属性时导致 nomethoderror)。所以,渲染new后没有得到:code参数。但是,验证失败后是否可以保留 :code 参数?

     class AffiliatesController < ApplicationController

        def new
          @m = Merchant.find_by_code(params[:code])
          @affiliate = Affiliate.new
        end


        def create
          a = Affiliate.new(params[:affiliate])
          if a.save
             redirect_to 'http://' + params[:ref]
          else
             render 'new'
          end
       end
    end
4

2 回答 2

1

params[:code]除了使用会话之外,另一种保留的方法是在表单中添加一个隐藏字段。

<%= form_for @affiliate do |f| %>
  <%= hidden_field_tag :code, @m.code %>

然后将创建操作更改为

def create
  @affiliate = Affiliate.new(params[:affiliate])

  if @affiliate.save
    redirect_to 'http://' + params[:ref]
  else
    @m = Merchant.find_by_code(params[:code])
    render :new
  end
end
于 2013-04-18T00:57:57.360 回答
0

在您调用之前,render您应该填写视图将使用的所有变量。因此,在您的情况下,您还需要在您之前@m = ... render 'new'内部实例化create

如果您需要一个额外的参数来完成此操作(param[:code]在您的情况下),我不建议您配置路由并通过 URI 传递此信息,这很复杂。

改用会话,它更容易!

例如:在index(或任何您有商家代码可用的地方)添加session[:merchant_code] = the_code.

变化new@m = Merchant.find_by_code(session[:merchant_code])

干杯,

于 2013-04-18T00:30:05.163 回答