如何在Rails中将url路径传递给form_for partial?

时间:2016-09-28 01:59:45

标签: ruby-on-rails forms

我试图将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&#39;对于#&lt;#:0x007f8d4d831fd0&gt;

我也尝试过:

  1. 只是url而不是url:url,但却收到同样的错误。
  2. 关注此主题:How to pass url to partial/form?
  3. 我现在已经尝试将这项工作工作了几个小时,感觉我已经没有选择尝试了。任何帮助指出我做错了什么都会非常感激!

3 个答案:

答案 0 :(得分:5)

您可以通过在编辑和新视图模板上打开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 %>

答案 1 :(得分:0)

使用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)。然后在视图和表单中一致使用它。

答案 2 :(得分:0)

在使用命名间隔的路线处理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>

仅此而已。

我希望这会有所帮助