0

我有一張用於創建票據的表單,該表單需要一個項目的ID。這有效,但不涉及驗證。如果驗證不會通過'render:new'並且project_id不附帶它。發送參數進行渲染

我已經嘗試了'redirect_to new_ticket_path(:project_id => params [:ticket] [:project_id]),它再次呈現窗體,但錯誤消息不會顯示出來,所以看起來我需要使用'render :新'。

如何將project_id傳遞迴表單或從表單到達project_id而不傳遞它?

def new 
    @ticket = Ticket.new 
    @id = params[:project_id] 
    @project = Project.find(@id) 
end 

def create 
    @ticket = Ticket.new(params[:ticket].merge(:user_id => current_user.id)) 

    if @ticket.save 
    redirect_to @ticket 
     else 
    render :new <--- will render without the project_id 
    end 
end 

回答

1

這會使剛剛查看'新',但不會運行控制器操作。您需要在「創建」操作中爲「新」視圖設置變量。

http://guides.rubyonrails.org/layouts_and_rendering.html#using-render

Using render with :action is a frequent source of confusion for Rails newcomers. The specified action is used to determine which view to render, but Rails does not run any of the code for that action in the controller. Any instance variables that you require in the view must be set up in the current action before calling render.

解決這個問題的最簡單的方法是改變 '新':

def new 
    @ticket = Ticket.new(:project_id => params[:project_id]) 
end 

,並更改任何引用你的 '新' 的形式向@project @ ticket.project 。此時,只要您的表單包含工單的項目ID的隱藏字段,就不必爲「創建」操作添加任何內容。

+0

嘗試了您的解決方案,但得到以下錯誤:「未定義的方法項目」爲#「...引用 - >」<%= f.hidden_​​field:project_id,:value => @ ticket.project.id %>「 – holyredbeard 2013-02-14 15:12:58

+0

好吧,像Ticket,Project和project_id這樣的名字,我認爲這就是名字。您的票務必須有'belongs_to:項目'或類似的,對嗎?您需要使用關係的名稱。 – Jim 2013-02-14 15:14:52

+0

.....有一個? :) – holyredbeard 2013-02-14 15:15:20

0

將項目編號寫入表單中的隱藏字段,你會好的。而且不要忘了在創建操作以初始化@id

def new 
    @ticket = Ticket.new 
    @id = params[:project_id] 
    @project = Project.find(@id) 
end 

def create 
    @ticket = Ticket.new(params[:ticket].merge(:user_id => current_user.id)) 
    @id = params[:project_id] # but make sure it is under this key in params 
    if @ticket.save 
    redirect_to @ticket 
     else 
    render :new <--- will render without the project_id 
    end 
end 

,並在表單中添加

<%= hidden_field :project_id, '', value: @id %> 
+0

我已經有了project_id的隱藏字段,但是當我在錯誤後渲染表單時,我再也沒有它了。 – holyredbeard 2013-02-14 15:01:01

+0

假設你在表單中使用你的'@ id'變量,對吧?您必須在您的創建操作中初始化它'@id = params [:project_id]'(或者它在params散列中的任何位置) – Phobos98 2013-02-14 15:03:30

+0

是的,我已經這樣做了。問題是,當我錯誤後再次渲染:new時,project_id將不會跟隨。 – holyredbeard 2013-02-14 15:19:45

-1

你爲什麼不使用:

flash[:alert] = @ticket.errors.inspect 
redirect_to new_ticket_path(:project_id => params[:ticket][:project_id]) 
+0

這顯示我在閃光消息中的錯誤,這不是我想要的。 – holyredbeard 2013-02-14 15:04:33

1

最簡單的方法是使任務資源嵌入到項目中。這樣,你將永遠有params中的project_id。

# config/routes.rb 
resources :projects do 
    resources :tasks 
end 

的URL看起來像projects/123/tasks/new等等看看rake routes