【问题标题】:When I try to load my create.html.erb page, I get this error "param is missing or the value is empty"当我尝试加载我的 create.html.erb 页面时,我收到此错误“参数丢失或值为空”
【发布时间】:2016-05-13 09:59:27
【问题描述】:

我在加载页面时遇到了这个错误,我猜它与我在控制器中的 create 方法有关 我的控制器是这样的

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 以前看起来不像这样,在我阅读了一些关于 form_for 将如何工作而不是 story_params 的 form_tag 的问题后,我将其更改为。 但无论哪种方式,我仍然会收到错误,我想知道为什么以及是否有解决方法。

【问题讨论】:

  • 你有create.html.erb?认真的吗?
  • 你创建的参数是什么? (查看您的服务器正在运行的控制台窗口。)
  • 我对 Rails 还是很陌生,难道我不应该有一个 create.html.erb
  • 应该是new.html.erb
  • 它只是说参数丢失或值为空:控制台日志上的故事

标签: ruby-on-rails ruby forms activerecord


【解决方案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

如果您在终端中执行rake routes,您可以看到所有方法及其预期方法

同样根据 Rails 的约定,如果你有故事模型,那么你可以直接创建 :title & :body 属性而不是 :story_title 和 :story_body

【讨论】:

  • 谢谢!这行得通,但直到我看到接受的答案的观点,我才明白为什么。你帮了大忙
  • 不客气。 .. 至少你明白出了什么问题。
【解决方案2】:

create 方法是一个 POST……所以当他进入故事/创建时,他已经在期待这些值了……这就是为什么他说他找不到参数……我没有深入研究代码但这似乎很好。只需将视图的名称更改为 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 %>

正如其他用户所说。你需要说这些输入属于表单 |f| text_field 属于 f,f.text_field

当然,您可以通过 stories/new 访问该视图

【讨论】:

  • 非常感谢,我没想到它会在输入故事/创建时期待这些参数。所以我会把它重命名为 new.html.erb。
  • create 始终是一种 POST 方法...它不使用视图 :) 很高兴我能提供帮助
【解决方案3】:

尝试在 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 %>

【讨论】:

  • 非常感谢您的回答,但我仍然遇到同样的错误
  • 参数丢失或值为空:故事
  • 你能把参数发给我吗?
【解决方案4】:

您确定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

然后查看生成的控制器和视图以充分了解其工作原理。

【讨论】:

  • 我的属性是story_title和story_body,这是肯定的。我自己生成了它们。生成一个假脚手架可以帮助我更好地理解,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多