2016-05-13 14 views
0

我在加載頁面時出現此錯誤,並且我猜測它有一些與我的操作有關的錯誤在控制器 我的控制器看起來像這樣當我嘗試加載我的create.html.erb頁面時,出現此錯誤「param丟失或值爲空」

class StoryController < ApplicationController 
def index 
    @story = Story.all 
end 

def new 
    @story = Story.new 
end 

def create 
    @story = Story.new(story_params) 
    if @story.save 
     flash[:notice] = "Story created successfully" 
     flash[:color]= "valid" 
    else 
     flash[:notice] = "Story is invalid, man" 
     flash[:color]= "invalid" 
end 

end 

def show 
    @story = Story.find(params[:id]) 
end 
private 
def story_params 
params.require(:story).permit(:story_title, :story_body) 
end 

end 

我create.html.erb看起來像

 <%= form_for @story ,url: story_path do |f| %> 
     <%= label :story, :title %><br /> 
     <%= text_field :story, :story_title %> 

     <%= label :story, :body %><br /> 
     <%= text_field :story, :story_body %> 
     <%= submit_tag 'Create story' %> 
     <% end %> 

我create.html.erb didnt之前是這樣創造的方法,我把它改成是在閱讀了關於如何使用form_for而不是form_tag for story_param的問題後秒。 但無論如何,我仍然得到錯誤,我想知道爲什麼,如果有修復它。

+0

查看你'create.html.erb'?當真? – Pavan

+0

什麼是你創造的參數? (看你的服務器運行的控制檯窗口) – jvillian

+0

我還是很新的rails,我不應該有一個create.html.erb –

回答

0

的創建方法是POST ......所以,當他進入故事/創建,他已經期待着這些價值觀......這就是爲什麼他說,他無法找到params ...我沒有深入地看代碼,但看起來很好。只需將視圖的名稱更改爲new.html.erb即可。新建是創建的設置。

在new中設置值,然後在控制器實際創建故事的地方調用create。

只需更改視圖的名稱new.html.erb並將其更改爲這個

<%= form_for @story do |f| %> 
<%= f.label :title %><br /> 
<%= f.text_field :story_title %> 
<%= f.label :body %><br /> 
<%= f.text_field :story_body %> 
<%= submit_tag 'Create story' %> 
<% end %> 

與其他網友說。你需要說這些輸入屬於form | f |在text_field屬於樓f.text_field

當然你訪問,通過故事/新

+0

非常感謝,我並沒有想到它會在輸入故事/創建時期待這些參數。所以我只是將其重命名爲new.html.erb。 –

+0

創建始終是POST方法...它不使用視圖:)很高興我可以幫助 – Boltz0r

0

試試這個讓在create.html.erb

<%= form_for @story ,url: story_path do |f| %> 
    <%= f.label :title %><br /> 
    <%= f.text_field :story_title %> 

    <%= f.label :body %><br /> 
    <%= f.text_field :story_body %> 
    <%= submit_tag 'Create story' %> 
    <% end %> 
+0

非常感謝你的回答,但我仍然得到相同的錯誤 –

+0

你可以在這裏給錯誤? – Sunny

+0

param丟失或者值爲空:故事 –

0

改變你確定你的Story對象屬性被命名爲story_titlestory_body

如果沒有,你story_params應該是這樣的:

def story_params 
params.require(:story).permit(:title, :body) 
end 

而且也適用@koshlendra建議,他是對的。

我建議你生成一個腳手架假的資源,看看它是如何工作的:

rails g scaffold Fake title:string body:text 

然後查看生成的控制器和視圖來了解它完全是如何工作的。

+0

我的屬性是story_title和story_body,這是肯定的。我自己生成了它們。生成一個假腳手架會幫助我更好地理解,謝謝! –

1

首先,如果您使用form_for並且您不想在自定義路由上提交表單,則不需要指定路徑。

如果您使用的是新對象,那麼它將在create方法上提交表單,併爲現有對象提交表單上的update方法。

所以你的形式將是,

<%= form_for @story do |f| %> 
    <%= f.label :title %><br /> 
    <%= f.text_field :story_title %> 
    <%= f.label :body %><br /> 
    <%= f.text_field :story_body %> 
    <%= submit_tag 'Create story' %> 
<% end %> 

這種形式需要在new.html.erb文件。

此表單將提交您的表單以使用post方法創建動作,並且您需要根據條件進行渲染或重定向。所以,你的控制器會,

class StoryController < ApplicationController 
    def index 
    @story = Story.all 
    end 

    def new 
    @story = Story.new 
    end 

    def create 
    @story = Story.new(story_params) 
    if @story.save 
     flash[:notice] = "Story created successfully" 
     flash[:color]= "valid" 
     redirect_to story_path(@story) 
    else 
     flash[:notice] = "Story is invalid, man" 
     flash[:color]= "invalid" 
     render :new 
    end 
    end 

    def show 
    @story = Story.find(params[:id]) 
    end 

    private 
    def story_params 
    params.require(:story).permit(:story_title, :story_body) 
    end 
end 

如果您在termial做rake routes,你可以看到它的預期的方法的所有方法

此外,根據Rails的慣例,如果你有故事模式,那麼你可以直接創建:標題&:身體屬性,而不是:STORY_TITLE和:story_body

+0

謝謝!這工作,但我不明白爲什麼,直到我看到接受答案的觀點。你非常樂意幫助 –

+0

。 ..至少你明白了什麼是錯的。 – bunty

相關問題