繁体   English   中英

Rails 3 - Forms,基于操作的自定义提交按钮?

[英]Rails 3 - Forms, Custom Submit Button based on Action?

我目前有几个 forms 我正在尝试更改提交它的按钮,如果我正在进行编辑或新操作。 我创建了两个 forms 但这闻起来很糟糕,现在我只使用单个表单部分。

在我的部分结尾,我的 forms 结尾有这样的内容:

<p>
  <% if controller.action_name == 'new' %>
  <%= f.submit "Create", :class => "pink_button"%> or
  <% elsif controller.action_name == 'edit' %>
  <%= f.submit "Update", :class => "pink_button"%> or
  <% end %>
  <%= link_to "cancel", :back %>
  </p>  

这样,如果我正在创建一些新的,按钮显示为“创建”,如果它是用户试图完成的更新,则按钮显示为“更新”。 这很好用,直到提交表单并且验证失败。

在我的 controller 中,我遇到了这样的失败:

def update
    @list = current_user.lists.find(params[:id])    

    if @list.update_attributes(params[:list])
      redirect_to list_path(@list), :notice => "List '#{@list.name}' updated."
    else
      render :action => 'edit'
    end
  end

所以表单只是简单地重新渲染。 问题是,我不再在编辑路径上。 这意味着,我的表单按钮不再显示。

我想做的事情有约定吗?

谢谢

是的,这在 Rails 中默认使用 i18n 处理。 翻译在 ActionView 中,如下所示:

en:
  helpers:
    select:
      # Default value for :prompt => true in FormOptionsHelper
      prompt: "Please select"

    # Default translation keys for submit FormHelper
    submit:
      create: 'Create %{model}'
      update: 'Update %{model}'
      submit: 'Save %{model}'

您需要做的就是f.submit (不通过“创建”或“编辑”等),翻译将执行 rest。 您可以通过将上述 yaml 放到您的本地语言环境中来覆盖这些。

如果您需要设置 class 您可以传递 nil,例如f.submit nil, :class => 'whatev'

Rails 的方法是检查记录是否是新的:

@list.new_record? ? "Create" : "Update" 

Rails 有一个persisted? 确定 object 是否持续存在。

如果您使用的是 erb,请执行

<%= f.submit (@list.persisted? ? 'Create' : 'Update) %>

如果您使用的是haml,请使用

= f.submit (@list.persisted? ? 'Create' : 'Update')

有关更多信息,请参阅http://apidock.com/rails/ActiveRecord/Persistence/persisted%3F

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM