【问题标题】:Rails 5 - Render New with ParameterRails 5 - 使用参数渲染新的
【发布时间】:2017-10-21 10:41:44
【问题描述】:

我已经检查过类似的旧帖子,但我仍然遇到问题。

当我创建一个新列表时,URL 如下所示: http://localhost:3000/listings/new?plan=1

在 form_for 中,当 plan=1 时我隐藏了一些字段

<%= form_for(@listing) do |f| %>
<%= render 'shared/error_messages', object: f.object %>

  <%= f.hidden_field :plan, :value => @plan %>

  <%= f.label :Title %>
  <%= f.text_field :title, class: 'form-control' %>

  <!-- don't show description for standard plan -->
  <% if @plan != 1.to_s %>
    <%= f.label :Description %>
    <%= f.text_area :description, :rows => 10,
      placeholder: "Describe your business...", class: 'form-control' %>
  <% end %>   

在 ListingsController 中,我在行动之前设置了计划:

before_action :set_plan,        only: [:new, :create]

    def set_plan
      @plan = params[:plan]
    end 

所以我可以将它用作上面表单中的隐藏字段。

当我保存有错误的表单时,我的问题就开始了。 新表单 URL 更改为 http://localhost:3000/listings。 我可以在表单上看到@plan=1:

<input value="1" type="hidden" name="listing[plan]" id="listing_plan" />

,但现在表单显示所有字段(由于这种情况应该隐藏 )

ListingsController 中的操作:

  def new
    @listing = Listing.new
  end

  def create
    @listing = current_user.listings.build(listing_params) if logged_in?
    @plan = @listing.plan

    if @listing.save
      flash[:success] = "Listing created!"
      redirect_to @listing
    else
      render 'new'
    end
  end

我尝试过类似的方法,但没有成功: 渲染 :action => 'new', :plan => @listing.plan 以及其他一些事情

如果出现错误,如何隐藏这些字段?

【问题讨论】:

  • 你不能使用@plan访问计划参数,而是使用params[:plan]
  • 当我转到第一个链接时,我在新操作中:参数:!ruby/hash:ActiveSupport::HashWithIndifferentAccess 计划:'1' 控制器:列表操作:新但是当我保存对于出现错误,它进入创建:参数:!ruby/hash:ActiveSupport::HashWithIndifferentAccess计划:'1'标题:''允许:错误提交:创建列表控制器:列表操作:创建计划在那里但是当我这样做时在他请求 Create: \@plan = params[:plan] 时,它没有得到 \@plan 的值。为什么?

标签: ruby-on-rails form-for


【解决方案1】:

您应该能够通过修改您的ListingsController 以在创建时设置计划来解决此问题。具体来说,在 ListingsController.rb 中:

# app/controllers/listings_controller.rb
before_action :set_plan, only: [:new, :create]

另外,请确保您的 listing_params 方法允许 :plan

如果您希望它在更新时起作用,请将 :update 添加到您的 before_action 中。

【讨论】:

  • 嗨,Tom,我试过了,但没有成功,params 允许计划。创建之前的 Set_plan 没有传递任何值,所以我在 Create - \@plan = \@listing.plan 中添加了这一行(参见编辑后的问题)。我可以看到提交表单上的值有错误 - ,所以我不明白为什么 IF 没有不工作
【解决方案2】:

我已经修好了。

@plan = params[:plan]

正在返回字符串(当 DB 中的字段为整数时),所以我将其更改为:

@plan = params[:plan].to_i

现在我有以下所有操作的形式:

<% if @plan != 1 %>

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 2023-03-05
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    相关资源
    最近更新 更多