2013-11-15 30 views
0

我有几个模型has_many :attachmentsRails redirect_to控制器中纠正页面

在创建Note之后,我试图重定向回Note view

这是我正在尝试的附件控制器代码。 @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 

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

感谢您的帮助!

+0

您无法访问在create中的新操作中初始化的实例变量。创建是一个单独的http请求,它不知道有关实例变量的任何信息@note – usha

+0

是否有某种方法将@note值存储在全局变量中并在create中使用? – Reddirt

回答

0

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

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

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

的“的before_filter”之前的任何新的请求被发送到“新的”或“创建”的方法将执行“initialize_vars”的方法。


更一般地,这涉及到一个非常重要的Rails概念(一般和服务器端的网络工程) - 有很小的“状态”的服务器中。服务器接受请求,处理它并忘记它。所有需要记住的东西都必须存储在服务器中,或者通过用户发送的请求以某种方式传达。

+0

我得到'@note = Note.find(params [:note_id])''无法找到没有ID的记事''代码 – Reddirt

+0

我也试过'@note = params [:note_id]',它是零在创造。 – Reddirt

+0

它在哪里得到:“新”方法中的note_id? – Bubbles

相关问题