【问题标题】:Rails: How to pass a url path to a form_for partial in Rails?Rails:如何在 Rails 中将 url 路径传递给 form_for partial?
【发布时间】:2016-09-28 01:59:44
【问题描述】:

我正在尝试将 urlvariable 传递给 Rails 中的部分表单。


方法#1:
这可行,但我不想将post_create_path 硬编码到表单中,以便它也可以用于#update。

new.html.erb

<%= render partial: 'shared/form', locals: { form: @form } %>

_form.html.erb

<%= form_for form, url: post_create_path do |f| %>
...
<% end %>

方法#2:
这不起作用。

new.html.erb

<%= render partial: 'shared/form', locals: { form: @form, url: post_create_path } %>

_form.html.erb

<%= form_for form, url: url do |f| %>
...
<% end %>

错误:

# 的未定义局部变量或方法“url”

我也尝试过:

  1. 只是url 而不是url:url,但得到相同的错误。
  2. 关注这个帖子:How to pass url to partial/form?

我已经尝试了几个小时来完成这项工作,但我觉得我已经没有办法尝试了。任何帮助指出我做错了什么都将非常感激!

【问题讨论】:

  • 您是否尝试将 url 重命名为不同的变量?也许实际的“url”字有问题?

标签: ruby-on-rails forms


【解决方案1】:

您可以通过在编辑和新视图模板上打开 form_for 来使用不同的操作,然后将表单对象传递给包含表单的所有创建和更新通用字段的部分

new.html.erb

<%= form_for @post, :url => { :action => "create" } do |form| %>
  <%= render partial: 'shared/form', locals: { f: form } %>

edit.html.erb

<%= form_for @post, :url => { :action => "update" } do |form| %>
  <%= render partial: 'shared/form', locals: { f: form } %>

共享/_form.html.erb

  <%= f.text_field :title %>
  ...
  <%= f.submit "Save" %>
<% end %>

【讨论】:

    【解决方案2】:

    使用locals 哈希作为form_for 参数:

    # new.html.erb
    <%= render partial: 'shared/form', form: @form, locals: { url: post_create_path, method: :post} %>
    
    # edit.html.erb
    <%= render partial: 'shared/form', form: @form, locals: { url: post_update_path, method: :put} %>
    
    # _form.html.erb
    <%= form_for form, locals do |f| %>
    ...
    <% end %>
    

    locals 只是一个哈希值,你可以给它起任何名字(比如vars)。然后在视图和表单中始终如一地使用它。

    【讨论】:

      【解决方案3】:

      在使用 命名空间路由 处理 Rails 应用程序时,我遇到了同样的挑战,但 sa77's answer 帮助了我。

      只是为了添加它。

      我的routes文件是这样的:

      Rails.application.routes.draw do
        namespace :users do
          resources :students
        end
      end
      

      所以我的new.html.erb被这样修改了:

      <h1>New User</h1>
      
      <%= form_with(model: @user, url: users_students_path, local: true) do |form| %>
        <%= render partial: 'form', user: @user, locals: { form: form } %>
      <% end %>
      
      <%= link_to 'Back', users_students_path %>
      

      而我的edit.html.erb 被这样修改:

      <h1>Editing User</h1>
      
      <%= form_with(model: @user, url: users_student_path(@user), local: true) do |form| %>
        <%= render partial: 'form', user: @user, locals: { form: form } %>
      <% end %>
      
      <%= link_to 'Show', users_student_path %> |
      <%= link_to 'Back', users_students_path %>
      

      然后我的_form.html.erb 文件被这样修改:

      <div class="field">
        <%= form.label :email %>
        <%= form.text_field :email %>
      </div>
      
      <div class="field">
        <%= form.label :password %>
        <%= form.text_field :password %>
      </div>
      
      <div class="actions">
        <%= form.submit %>
      </div>
      

      就是这样。

      我希望这会有所帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-05
        相关资源
        最近更新 更多