Rails redirect_to在控制器中纠正页面

时间:2013-11-15 20:38:05

标签: ruby-on-rails

我有几个模型has_many :attachments

创建Note view后,我正在尝试重定向回Note

这是我正在尝试的附件控制器代码。 @note告诉我此附件与Note

相关
# GET /attachments/new
# GET /attachments/new.json
def new
  @attachment = Attachment.new
  @comment = params[:comment_id]
  @note = params[:note_id]

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @attachment }
  end
end

# POST /attachments
# POST /attachments.json
def create
  @attachment = Attachment.new(params[:attachment])

  respond_to do |format|
    if @attachment.save
      if @note != nil
        format.html { redirect_to note_path(@note), notice: 'Attachment was successfully created.' }
      else
        format.html { redirect_to attachments_path, notice: 'Attachment was successfully created.' }
      end 

但是,create代码发生时,@ note是零。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

通常,您可能不会在同一上下文中看到“新”和“创建”块。这有点令人满意,所以让我们更具体一点:当你调用“create”时,你在“new”中声明的变量将不会存在。因此,您要在“create”中使用的任何变量也必须在那里声明。

您可以做的一件事(取决于代码)是在为您初始化这些变量的不同控制器方法之间共享一个块。例如:

before_filter :initialize_vars, only: [:new, :create]
...
def initialize_vars
  @note = params[:note_id]
end

“before_filter”将在将任何新请求发送到“new”或“create”方法之前执行“initialize_vars”方法。


更一般地说,这涉及一个非常重要的Rails概念(以及一般的服务器端Web工程) - 服务器中的“状态”很少。服务器接收请求,处理它并忘记它。需要记住的所有内容都必须存储在服务器中,或者通过用户发送的请求以某种方式进行通信。