如何进行渲染:控制器中的new控件并且不丢失url中的参数?

我想通过控制器在我的create方法中使用render :new,问题是,它更改了url,并且在url中我有一个参数需要填写html中的表单(例如:localhost3000 / episodes / new?serie_id = 8,我使用hidden_​​field_tag进行此操作。

我的控制器:

  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:

  <%= form_for @chapter do |f| %>
        <%= f.label :name,'Name' %>
        <%= f.text_field :name%> <!-- I don't want to use required: true -->
        <%= f.hidden_field :serie_id,value: params[:serie_id] %>
  <% end %>

如果用户按下从新创建表单的按钮,如果他在填写表单时犯了一个错误,则无法保存@episode并进行render :new并将url更改为localhost3000 / episodes /

我该如何render :new不更改网址?

我试图代替render :new使用redirect_to new_episode_path(:serie_id => params[:episode][:serie_id]),但是这丢失了用户在表单中输入的内容,并且所有验证都无法显示发生了什么,所以这不是一个选择。

关于项目的模棱两可的信息:我正在制作一个Netflix网站来学习Rails,一个意甲(名称)有很多插曲,一个情节(名称,serie_id)属于一个意甲。

endy1009 回答:如何进行渲染:控制器中的new控件并且不丢失url中的参数?

我会改变

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

<%= f.hidden_field :serie_id,value: (f.object.serie_id.presence || params[:serie_id]) %>

仅在尚未在该章上设置params[:serie_id]属性时才退回到serie_id

,

实现这一目标的方法是创建一个nested resource

# config/routes.rb
resources :series do
  resources :episodes,shallow: true
end

运行rails routes以查看路由输出。这里的主要要点是它创建了一条GET /series/:series_id/episodes/new路由和一条POST /series/:series_id/episodes。这样一来,两个资源之间的链接就变得很明确-而不是隐藏在请求正文中的内容。

通常,如果您使用隐藏字段来传递资源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_id/episodes而不是/series,我们传递一个数组:

<%= form_for([@series,@episode]) %>
  <%= f.label :name,'Name' %>
  <%= f.text_field :name%>
  <%= f.submit %>
<% end %>
  

如果用户按下将表格从新添加到摘要的按钮,   如果他在填写表格时犯了一个错误,则无法保存@episode   并使render:new然后将URL更改为   本地主机3000 / episodes /

这是一个非常普遍的初学者挂断,是由于不了解Rails style REST的工作原理引起的

在REST中,您可以通过发布到收集路径(POST /episodes)来创建资源。这意味着通过发布表单可以更改浏览器的URL,而这正是应该的样子。

render :new不会更改URL。它仅指示Rails渲染 app / views / episodes / new.html.erb 视图。

然后您看到的是执行非幂等动作的结果。您不应该重定向回去,因为这既不必要,又要求您将所有参数放在不太理想的查询字符串中。

PS

您还应该注意,correct singular form of series in English系列而不是系列。不确定滑轨是否会正确变形,但如果不正确,则可以通过设置变形来实现。

# config/intializers/inflections.rb
ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.irregular 'series','series'
en

然后应该重命名模型和关联。

为什么这很重要? The principle of least suprise.

本文链接:https://www.f2er.com/3168884.html

大家都在问