Ruby on rails 如何使用简单表单向控制器发送任意参数
我正在建立一个时事通讯管理表单,我想使用简单的表单。Ruby on rails 如何使用简单表单向控制器发送任意参数,ruby-on-rails,ruby,simple-form,Ruby On Rails,Ruby,Simple Form,我正在建立一个时事通讯管理表单,我想使用简单的表单。email参数应通过POST方法发送给email\u订户#managecontroller/action routes.rb get 'email/login' => 'email_subscribers#login', as: 'email_login' get 'email/manage' => 'email_subscribers#manage', as: 'email_manage' def login end def
email
参数应通过POST
方法发送给email\u订户#manage
controller/action
routes.rb
get 'email/login' => 'email_subscribers#login', as: 'email_login'
get 'email/manage' => 'email_subscribers#manage', as: 'email_manage'
def login
end
def manage
@subscriber = EmailSubscriber.find_by_email(safe_params(:email))
unless @subscriber
# redirect_to email_login_path, notice: 'That email does not exist.'
end
end
电子邮件\u订户\u控制器.rb
get 'email/login' => 'email_subscribers#login', as: 'email_login'
get 'email/manage' => 'email_subscribers#manage', as: 'email_manage'
def login
end
def manage
@subscriber = EmailSubscriber.find_by_email(safe_params(:email))
unless @subscriber
# redirect_to email_login_path, notice: 'That email does not exist.'
end
end
电子邮件/登录表单
<%= render :layout => 'application/container' do %>
<%= simple_form_for(@subscriber, path: :email_manage_path, method: :get) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :email, as: :email %>
</div>
<div class="form-actions">
<%= f.button :submit, value: 'Manage Subscription' %>
</div>
<% end %>
“应用程序/容器”do%>
登录路径是表单所在的位置。它允许用户输入他们的电子邮件以取消订阅时事通讯
表单应重定向到管理
操作,传递没有相应模型的电子邮件
参数
当前表单不工作。出于某种原因,它会重定向到EmailSubscribers
索引页面。
将email\u manage
路由更改为POST
会导致丢失路由POST-email/login
,这毫无意义,因为表单是发布到email\u manage\u路径
,而不是email\u-login\u路径
谢谢
编辑:
耙路由输出(在此同一选项卡中打开)
实际上,您可以将其建模为传统的RESTful资源:
resources :subscriptions
namespace :subscriptions do
resources :logins
get '/login', to: 'logins/create'
end
这样做的好处是,您可以获得一个遵循规范crud谓词的简单得多的设置,并且还可以使用正确的HTTP谓词
这里唯一非常规的部分是,我们通过GET向create
添加了一条额外的路径:
# app/controllers/subscriptions/logins_controller.rb
class Subscriptions::LoginsController < ApplicationController
rescue_from ActionController::ParameterMissing, with: :subscription_not_found
# GET /subscriptions/logins/new
def new
@subscription = Subscription.new
end
# POST /subscriptions/logins
# GET /subscriptions/login
def create
@subscription = Subscription.find_by_email(email_param)
if @subscription
redirect_to edit_subscription_path(@subscription)
else
subscription_not_found
end
end
private
def subscription_not_found
render :new, error: 'Email could not be found.'
end
def email_param
if request.post?
params.require(:subscription).fetch(:email)
else
params.fetch(:email)
end
end
end
#app/controller/subscriptions/logins_controller.rb
类订阅::LoginsController
因为我们实际上是绑定到一个资源,所以您可以非常直接地设置表单。我们还添加了一个GET路由,允许用户直接从链接登录
形式非常直截了当
<%= simple_form_for(@subscription, path: subscriptions_sessions_path) do %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :email, as: :email %>
</div>
<div class="form-actions">
<%= f.button :submit, value: 'Manage Subscription' %>
</div>
<% end %>
然后,您可以创建一个运行良好的CRUD控制器,允许用户编辑或取消订阅:
# app/controllers/subscriptions_controller.rb
class SubscriptionsController < ApplicationController
before_action :set_subscription, only: [:edit, :update, :destroy]
rescue_from ActiveRecord::RecordNotFound, with: :invalid_email
def new
@subscription = Subscription.new
end
def create
@subscription = Subscription.new(subscription_params)
if @subscription.save(subscription_params)
redirect_to root_path, success: 'Your subscription settings have been creates'
else
render :new
end
end
def edit
end
def update
if @subscription.update(subscription_params)
redirect_to root_path, success: 'Your subscription settings have been updated'
else
render :edit
end
end
def destroy
@subscription.destroy
redirect_to root_path
end
private
def set_subscription
@subscription = Subscription.find(params[:id])
end
def subscription_params
params.require(:subscription).permit(:foo, :bar, :baz)
end
end
#app/controllers/subscriptions_controller.rb
类订阅控制器<应用程序控制器
在\u操作之前:设置\u订阅,仅:[:编辑,:更新,:销毁]
使用::无效的\u电子邮件从ActiveRecord::RecordNotFound中解救\u
def新
@subscription=subscription.new
结束
def创建
@订阅=订阅。新建(订阅参数)
if@subscription.save(订阅参数)
重定向到根路径,成功:“您的订阅设置已创建”
其他的
渲染:新
结束
结束
定义编辑
结束
def更新
if@subscription.update(订阅参数)
重定向到根路径,成功:'您的订阅设置已更新'
其他的
渲染:编辑
结束
结束
def销毁
@订阅。销毁
将\重定向到根\路径
结束
私有的
def set_订阅
@subscription=subscription.find(参数[:id])
结束
def订阅参数
参数require(:subscription).permit(:foo,:bar,:baz)
结束
结束
您可以发布您的路线吗rake routes
添加了一个带有完整的rake routes
outputi的粘贴箱,我需要一些时间才能让它下沉。在技术上没有回答这个问题,因为我仍然想知道如何在没有模型的情况下使用simple_form,但我确实喜欢你的方法。非常聪明!现在将您的答案集成到我的应用程序中。通过创建一个包含ActiveModel::model
的“虚拟”模型,您可以在没有表支持模型的情况下使用它,或者您只需使用普通的旧rails标记帮助器来创建输入元素。SF不是没有模型就可以工作的。另外,创建令牌是一个好主意,您可以在电子邮件中发送,而不是使用用户电子邮件作为参数。为什么/login
路径会转到会话#create
?是否应该转到登录#创建
?