Ruby on rails 如何进行渲染:在控制器中新建,并且不会从url中丢失参数?

Ruby on rails 如何进行渲染:在控制器中新建,并且不会从url中丢失参数?,ruby-on-rails,ruby,parameters,render,Ruby On Rails,Ruby,Parameters,Render,我想从一个控制器在我的create方法中做一个render:new,问题是,它改变了url,在url中我有一个参数需要在html中填充表单(比如:localhost3000/scents/new?serie\u id=8,我用一个隐藏的\u字段\u标记来完成) 我的控制器: def new @episode= Episode.new end def create # params = { episode: { name: valor, serie_id: valor

我想从一个控制器在我的create方法中做一个
render:new
,问题是,它改变了url,在url中我有一个参数需要在html中填充表单(比如:localhost3000/scents/new?serie\u id=8,我用一个隐藏的\u字段\u标记来完成)

我的控制器:

  def new
    @episode= Episode.new
  end

  def create
    # params = { episode: { name: valor, serie_id: valor, ... more} }
    @episode = Episode.new(episode_permits)
    if @episode.save
      redirect_to @episode
    else
      render :new #This render I want to fix
    end
  end
我的部分_form.html.erb:


如果用户按下将表单从“新建”添加到“创建”的按钮,如果他填写表单时出错,@插曲将无法保存,并执行
render:new
,然后url将更改为localhost3000/插曲/

如何处理
render:new
不更改url

我尝试不使用
render:new
使用
redirect\u到new\u插曲路径(:serie\u id=>params[:插曲][:serie\u id])
,但这丢失了用户输入表单的内容,并且任何验证都不会显示发生了什么,因此这不是一个选项

如果项目模棱两可的话,只需提供更多信息:我正在制作一个Netflix网站来学习Rails,一个系列(名称)有很多集,一个系列(名称,serie_id)属于一个系列。

我只想改变一下

<%= f.hidden_field :serie_id, value: params[:serie_id] %>



当章节上未设置
序列id
属性时,仅回退到
参数[:序列id]

实现此目的的方法是创建:

运行
rails routes
查看routes输出。这里的关键是它创建了一个
GET/series/:series\u id/scents/new
路线和一个
POST/series/:series\u id/scents
。这使得两个资源之间的链接显式化,而不是隐藏在请求主体中的内容

通常,如果您使用隐藏字段来传递资源id或用户id,那么您就错了

class EpisodesController
  before_action :set_series

  # GET /series/1/episodes/new
  def new
    @episode = @series.episodes.new
  end

  # POST /series/1/episodes
  def create
    @episode = @series.episodes.new(episode_params)
    if @episode.save
       redirect_to @episode
    else
       render :new
    end
  end
  # ...
  private 
  def set_series
     @series = Series.find(params[:series_id])
  end

  def episode_params
    params.require(:episode).permit(:foo, :bar, :baz)
  end
end
要获取要发布到
/series/:serie\u id/scents
而不是
/series
的表单,我们传递一个数组:

<%= form_for([@series, @episode]) %>
  <%= f.label :name, 'Name' %>
  <%= f.text_field :name%>
  <%= f.submit %>
<% end %>
然后应该重命名模型和关联


为什么这很重要

render:new
只渲染一个视图,它不会更改URL。也许只是我,但我不明白你的问题。你能解释一下它是如何改变你应用程序中的URL的吗?您可以添加一些代码以及用户使用视图和单击问题链接的步骤以使问题更清楚吗?请发布控制器,渲染时不应丢失参数。@Mark我编辑了主题,很抱歉第一次没有这么详细time@spickermann编辑专题,,很抱歉第一次没有这么详细,“不确定rails是否会正确地改变它,但是如果不能,你可以通过设置一个改变来实现。”rails可以并且确实承认这一点。e、 g.
“系列”。奇点化#=>“系列”
系列。复数化(3)#=>“系列”
。实际上,这个系列在感谢@enginersmnky在撰写本文时无法测试它。嗨!谢谢!这解决了我的问题!我对这种单数形式的不好,也许是显而易见的,但英语不是我的母语。
class EpisodesController
  before_action :set_series

  # GET /series/1/episodes/new
  def new
    @episode = @series.episodes.new
  end

  # POST /series/1/episodes
  def create
    @episode = @series.episodes.new(episode_params)
    if @episode.save
       redirect_to @episode
    else
       render :new
    end
  end
  # ...
  private 
  def set_series
     @series = Series.find(params[:series_id])
  end

  def episode_params
    params.require(:episode).permit(:foo, :bar, :baz)
  end
end
<%= form_for([@series, @episode]) %>
  <%= f.label :name, 'Name' %>
  <%= f.text_field :name%>
  <%= f.submit %>
<% end %>
# config/intializers/inflections.rb
ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.irregular 'series', 'series'
en